我正在尝试附加或连接两个具有不同尺寸的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数组吗?
谢谢,杰斯珀。
答案 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]])
希望有帮助。 谢谢