追加不同维数的numpy数组

时间:2019-02-12 15:16:30

标签: python arrays pandas numpy

我正在尝试附加或连接两个具有不同尺寸的numpy数组。到目前为止看起来还不太好。

例如,

a = np.arange(0,4).reshape(1,4)
b = np.arange(0,3).reshape(1,3)

我正在尝试

G = np.concatenate(a,b,axis=0)

我收到一个错误,因为a和b的维数不同。我需要连接a和b的原因是我试图递归求解模型,并且状态空间随时间而变化。因此,我需要调用最后一个值函数作为输入,以获取下一个时间段的值函数,等等:

for t in range(T-1,0,-1):

    VG,CG = findv(VT[-1])

    VT = np.append(VT,VG,axis=0)  
    CT = np.append(CT,CG,axis=0) 

但是,VT从时间段到下一个时间段具有不同的维度。

有人知道如何处理不断变化的尺寸的VT和CT numpy数组吗?

好的-感谢您的输入...我需要输出具有以下形式:

G = [[0, 1, 2, 3],
     [0, 1, 2]]

所以,如果我写G [-1],我将得到最后一个元素

[0,1,2].

我不知道那是否是一个numpy数组吗?

谢谢,杰斯珀。

4 个答案:

答案 0 :(得分:4)

In [71]: a,b,c = np.arange(0,4), np.arange(0,3), np.arange(0,7)

很容易将这些数组一次或全部添加到列表中:

In [72]: [a,b,c]
Out[72]: [array([0, 1, 2, 3]), array([0, 1, 2]), array([0, 1, 2, 3, 4, 5, 6])]
In [73]: G =[a,b]
In [74]: G.append(c)
In [75]: G
Out[75]: [array([0, 1, 2, 3]), array([0, 1, 2]), array([0, 1, 2, 3, 4, 5, 6])]

我们可以从该列表中创建一个对象dtype数组。

In [76]: np.array(G)
Out[76]: 
array([array([0, 1, 2, 3]), array([0, 1, 2]),
       array([0, 1, 2, 3, 4, 5, 6])], dtype=object)

请注意,有时这可能会产生2d数组(如果所有子数组的大小相同)或出错。通常,最好坚持使用列表。

通常不建议对数组重复附加或连接。正确地进行操作比较棘手,而且在工作时会变慢。

但是让我们演示一下:

In [80]: G = np.array([a,b])
In [81]: G
Out[81]: array([array([0, 1, 2, 3]), array([0, 1, 2])], dtype=object)

c通过简单的串联来“扩展”:

In [82]: np.concatenate((G,c))
Out[82]: 
array([array([0, 1, 2, 3]), array([0, 1, 2]), 0, 1, 2, 3, 4, 5, 6],
      dtype=object)

相反,我们需要将c包装在自己的对象dtype数组中:

In [83]: cc = np.array([None])
In [84]: cc[0]= c
In [85]: cc
Out[85]: array([array([0, 1, 2, 3, 4, 5, 6])], dtype=object)
In [86]: np.concatenate((G,cc))
Out[86]: 
array([array([0, 1, 2, 3]), array([0, 1, 2]),
       array([0, 1, 2, 3, 4, 5, 6])], dtype=object)

通常,当我们连接时,dtype必须匹配或至少兼容。在这里,所有输入都必须是对象dtype。连接复合dtypes(结构化数组)时,同样适用。只有在连接简单的数字dtypes(和字符串)时,我们才能忽略dtypes(前提是我们不关心整数变成浮点数,等等)。

答案 1 :(得分:2)

您在此处缺少括号。

请参阅下面的串联文档。

https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.concatenate.html

import numpy as np

a = np.arange(0,4).reshape(1,4)
b = np.arange(0,3).reshape(1,3)

c = np.concatenate((a,b), axis=1) #axis 1 as you have reshaped the numpy array

以上内容将为您提供串联输出 c

array([[0, 1, 2, 3, 0, 1, 2]])

答案 2 :(得分:2)

您不能真正堆叠具有不同尺寸或尺寸的阵列。

这是列表(如果我理解正确,请提供您想要的输出种类):

G = [[0, 1, 2, 3],
     [0, 1, 2]]

已转换为numpy数组:

G_np = np.array(G)

>>> G_np.shape 
(2,)
>>> G_np 
array([list([0, 1, 2, 3]), list([0, 1, 2])], dtype=object)
>>>

您的情况下的解决方案(根据您的要求):

a = np.arange(0,4)
b = np.arange(0,3)
G_npy = np.array([a,b])

>>> G_np.shape 
(2,)

>>> G_np 
array([array([0, 1, 2, 3]), array([0, 1, 2])], dtype=object)

>>> G_npy[-1]
array([0, 1, 2])

编辑:关于您在评论中的问题

我必须承认我不知道如何正确地进行操作。

但是,如果可以采用骇人听闻的方法(也许是正确的方法),那么:

G_npy = np.array([a,b])
G_npy = np.append(G_npy,None) # Allocate space for your new array
G_npy[-1] = np.arange(5) # populate the new space with new array

>>> G_npy
array([array([0, 1, 2, 3]), array([0, 1, 2]), array([0, 1, 2, 3, 4])],
      dtype=object)
>>>

或这种方式-但是,使用numpy没有意义

temp = [i for i in G_npy]
temp.append(np.arange(5))
G_npy = np.array(temp)

注意:

说实话,我认为numpy不适合收集对象(像这样的列表)。 如果我是你,我将继续添加真实列表。最后,我将其转换为numpy。但是毕竟,我不知道您的应用程序,所以我不知道什么是最好的态度

答案 3 :(得分:1)

尝试这种方式:

import numpy as np
a = np.arange(4).reshape(2,2)
b = np.arange(6).reshape(2,3)
c = np.arange(8).reshape(2,4)
a
# array([[0, 1],
#       [2, 3]])
b
# array([[0, 1, 2],
#       [3, 4, 5]])
c
# array([[0, 1, 2, 3],
#       [4, 5, 6, 7]])
np.hstack((a,b,c))
#array([[0, 1, 0, 1, 2, 0, 1, 2, 3],
#       [2, 3, 3, 4, 5, 4, 5, 6, 7]])

希望有帮助。 谢谢