Предпочтительный способ построения массива с помощью цикла является сбор значений в списке, а также выполнять concatenate
один раз, в конце:
In [1025]: data
Out[1025]:
array([[2, 2, 2],
[3, 3, 3]])
In [1026]: Weights
Out[1026]:
array([[4, 4, 4],
[4, 4, 4],
[4, 4, 4]])
Append к списку гораздо быстрее, чем повторил concatenate
; плюс это позволяет избежать «empty` вопроса формы массива:
In [1027]: alist=[]
In [1028]: for row in data:
...: alist.append(row*Weights)
In [1029]: alist
Out[1029]:
[array([[8, 8, 8],
[8, 8, 8],
[8, 8, 8]]), array([[12, 12, 12],
[12, 12, 12],
[12, 12, 12]])]
In [1031]: np.concatenate(alist,axis=0)
Out[1031]:
array([[ 8, 8, 8],
[ 8, 8, 8],
[ 8, 8, 8],
[12, 12, 12],
[12, 12, 12],
[12, 12, 12]])
Вы также можете присоединиться к массивам на новом измерении с np.array
или np.stack
:
In [1032]: np.array(alist)
Out[1032]:
array([[[ 8, 8, 8],
[ 8, 8, 8],
[ 8, 8, 8]],
[[12, 12, 12],
[12, 12, 12],
[12, 12, 12]]])
In [1033]: _.shape
Out[1033]: (2, 3, 3)
Я могу построить эту 3d версию с простым эфиром не умножение - нет петель
In [1034]: data[:,None,:]*Weights[None,:,:]
Out[1034]:
array([[[ 8, 8, 8],
[ 8, 8, 8],
[ 8, 8, 8]],
[[12, 12, 12],
[12, 12, 12],
[12, 12, 12]]])
Добавить .reshape(-1,3)
к тому, чтобы получить (6,3) версию.
np.repeat(data,3,axis=0)*np.tile(Weights,[2,1])
также производит желаемый массив 6x3.
Я попробовал второй вариант, он отлично работал и сделал цель. – Adam
Я бы сказал, что попробовал третий вариант, но для меня это не очень понравилось – Adam
Интересно. Возможно, ваши данные сложнее, чем вы показали, он дает желаемый результат как для python 2, так и для python 3 для меня. – Psidom