如何将一个numpy矩阵附加到一个空的numpy数组中

时间:2016-10-21 23:50:31

标签: python arrays numpy matrix append

我想通过循环

将一个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"到"所有"通过循环?

4 个答案:

答案 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.arraynp.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阵列。