Усреднить все элементы списка A, чьи индексы имеют одинаковое значение в списке B - PullRequest
0 голосов
/ 30 апреля 2020
values_array = np.array([2,4,6])
coords_array = np.array([[127,130,130],[127,130,130],[128,131,132]])

Каждый элемент v в values_array имеет "координату" c в той же позиции в ords_array.

Мне нужно сопоставление уникальной координаты c со средним значением всех значений, которые имеют эта координата. Для примера, который будет

mapping[[127,130,130]] = np.mean([2,4])
mapping[[128,131,132]] = np.mean([6])

Не беспокоясь о скорости, я бы сделал:

mapping = {}
for coordinate in np.unique(coords_array):
    indices = np.where(coords_array==coordinate)
    mapping[coordinate] = np.mean(values_array[indices])

Мне действительно нужно сделать это без l oop в python, если хотя все возможно.

1 Ответ

0 голосов
/ 30 апреля 2020

Мы могли бы использовать np.unique, чтобы пометить каждый уникальный цвет, а затем bincount, чтобы получить помеченные средние значения -

In [145]: u,t = np.unique(coords_array, axis=0, return_inverse=True)

# Unique avg colors
In [146]: u
Out[146]: 
array([[127, 130, 130],
       [128, 131, 132]])

# Avg values    
In [147]: np.bincount(t, values_array)/np.bincount(t)
Out[147]: array([3., 6.])

Или дополнительно, использовать return_counts arg, чтобы получить счет непосредственно -

In [156]: u,t,c = np.unique(coords_array, axis=0, return_inverse=True, return_counts=True)

In [159]: np.bincount(t, values_array)/c
Out[159]: array([3., 6.])

Итак, если вам нужно назначить эти средние значения в трехмерный массив a, просто выполните -

a[tuple(u.T)] = avg # avg are average values from bincount output
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...