Я хотел бы, чтобы скопировать элементы массива (a
) в результирующий массив b
в соответствии с некоторыми правилами, которые определяют, какой элемент из a
идет туда, где в b
. Я привел пример ниже.Копирование между массивами путем индексации
Возможно ли (посредством некоторого умного индексации?) Выполнить последний шаг (b[x,mask] = a[mask]
) за один шаг для всех x
или это может быть достигнуто только в цикле, как показано (расширенным способом) ниже? x
в моем реальном примере довольно большой (~ 100), поэтому я думаю, что это может извлечь выгоду из удаления цикла.
a = np.asarray([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
m1 = a > 6
m2 = ~m1 & ((a < 8) & (a > 4))
m3 = ~m1 & ~m2 & (a > 1)
m4 = ~m1 & ~m2 & ~m3 & (a < 10)
b = np.zeros((4, 3, 3))
b[0, m1] = a[m1]
b[1, m2] = a[m2]
b[2, m3] = a[m3]
b[3, m4] = a[m4]
print '0\n', b[0]
print '1\n', b[1]
print '2\n', b[2]
print '3\n', b[3]
Выход:
0
[[ 0. 0. 0.]
[ 0. 0. 0.]
[ 7. 8. 9.]]
1
[[ 0. 0. 0.]
[ 0. 5. 6.]
[ 0. 0. 0.]]
2
[[ 0. 2. 3.]
[ 4. 0. 0.]
[ 0. 0. 0.]]
3
[[ 1. 0. 0.]
[ 0. 0. 0.]
[ 0. 0. 0.]]
Поскольку количество элементов 'True' в каждом' m #' варьируется, сложно сделать это как одну 2-3-мерную операцию. (они 3,2,3,1). Возможно, вам придется вычислить сплющенные 1d эквиваленты. – hpaulj