我想通过循环
将一个numpy数组(矩阵)附加到数组中data=[[2 2 2] [3 3 3]]
Weights=[[4 4 4] [4 4 4] [4 4 4]]
All=np.array([])
for i in data:
#i=[2 2 2 ] #for example
h=i*Weights
#h=[[8 8 8][8 8 8][8 8 8]]
All=np.concatenate((All,h),axis=0)
我认为这个错误:
ValueError: all the input arrays must have same number of dimensions
我想要"所有"变量
[[8 8 8][8 8 8][8 8 8] [12 12 12][12 12 12][12 12 12]]
任何方式我都可以添加" h"到"所有"通过循环?
答案 0 :(得分:1)
选项1 :
将您的初始All
数组重新整理为3列,以使列数与h
匹配:
All=np.array([]).reshape((0,3))
for i in data:
h=i*Weights
All=np.concatenate((All,h))
All
#array([[ 8., 8., 8.],
# [ 8., 8., 8.],
# [ 8., 8., 8.],
# [ 12., 12., 12.],
# [ 12., 12., 12.],
# [ 12., 12., 12.]])
选项2 : 使用if-else语句处理初始的空数组:
All=np.array([])
for i in data:
h=i*Weights
if len(All) == 0:
All = h
else:
All=np.concatenate((All,h))
All
#array([[ 8, 8, 8],
# [ 8, 8, 8],
# [ 8, 8, 8],
# [12, 12, 12],
# [12, 12, 12],
# [12, 12, 12]])
选项3 :
使用itertools.product()
:
import itertools
np.array([i*j for i,j in itertools.product(data, Weights)])
#array([[ 8, 8, 8],
# [ 8, 8, 8],
# [ 8, 8, 8],
# [12, 12, 12],
# [12, 12, 12],
# [12, 12, 12]])
答案 1 :(得分:0)
Adam,如何使用一对嵌套循环呢?我相信这段代码会做你想要的。
import numpy as np
data = ([2,2,2],[3,3,3])
weights = ([4,4,4],[4,4,4],[4,4,4])
output=np.array([])
for each_array in data:
for weight in weights:
each_multiplication = np.multiply(each_array, weight)
output = np.append(output,each_multiplication)
print output
np.multiply()执行元素乘法而不是矩阵乘法。从您的示例输入和输出中我可以理解为止,这就是您要完成的任务。
答案 2 :(得分:0)
它可能不是最佳解决方案,但似乎有效。
data = np.array([[2, 2, 2], [3, 3, 3]])
Weights = np.array([[4, 4, 4], [4, 4, 4], [4, 4, 4]])
All = []
for i in data:
for j in Weights:
h = i * j
All.append(h)
All = np.array(All)
我想说它不是最好的解决方案,因为它会将结果附加到列表中,最后将列表转换为numpy数组,但它适用于小型应用程序。我的意思是如果你必须做这样重的计算,我会考虑寻找另一种方法。无论如何,使用这种方法,您不必考虑浮点数的转换次数。希望这可以帮助。
答案 3 :(得分:0)
使用循环构造数组的首选方法是在列表中收集值,并在结束时执行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]])
附加到列表比重复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阵列。