numpy数组的形状操作

时间:2016-02-18 16:11:53

标签: python numpy

''给出条件然而它是获得的。 我想得到结果'在所需的形状。 我尝试了如下;但它超出了我的想象。

import numpy as np
data = [np.ones((300,1)), np.ones((300,5)), np.ones((300,3))]

result = []
for d in data:
  **print np.shape(np.array(d))**
  result.append(d)
print np.shape(np.array(result))

结果应该是这样的形状: (300, 1+5+3) = (300,9)

有人能帮助我吗?

我得到了

  

ValueError:无法将形状(300,1)的输入数组广播为形状(300)

编辑: 数据只是为了提出这个问题;它只是我的大型计划的代表。给定条件是d,这是一个列表,但列表中的不同形状是从for循环生成的。

5 个答案:

答案 0 :(得分:2)

您的result是Python list。实际上它是list,其内容与原始data完全相同。您正在尝试水平连接数组(沿第二维),因此您需要使用numpy.hstack

import numpy as np
data = []
for d in some_source:
    data.append(d)
result = np.hstack(data)
print result.shape

如果some_source是列表,生成器或任何其他可迭代的,您可以更简洁地执行此操作:

result = np.hstack(some_source)

答案 1 :(得分:2)

3个2d数组最后一个维度的差异可以在该维度上连接

Np.concatenate(data, axis=1)

hstack也是如此。

在我的评论中,我建议使用0轴,但这是一个快速反应,我没有机会测试它。

当你尝试创意而他们失败时,告诉我们出了什么问题。您列出ValueError但不显示发生的位置。什么操作。

您的评论对d有很大帮助,但您没有说明d可能与data的元素有何不同。

答案 2 :(得分:2)

您还可以尝试numpy.column_stack,它本质上是numpy.concatenate

使用示例

In [1]: import numpy as np

In [2]: data = [np.ones((300,1)), np.ones((300,5)), np.ones((300,3))]

In [3]: out = np.column_stack(data)

In [4]: out.shape
Out[4]: (300, 9)

答案 3 :(得分:1)

您希望水平堆叠元素(如果您将每个元素想象为具有300行和可变列数的矩阵),即

import numpy as np
data = [np.ones((300,1)), np.ones((300,5)), np.ones((300,3))]
result = np.hstack(data)

如果您只能访问生成元素d的迭代器,则可以实现以下相同:

result = np.hstack([d for d in some_iterator_that_generates_your_ds])

答案 4 :(得分:0)

尝试:

import numpy as np
data = [np.ones((300,1)), np.ones((300,5)), np.ones((300,3))]

result = []
print(len(data))
for d in data:
    result.append(np.hstack(d))

print(result.shape)

这应该可以胜任。您也可以尝试:

import numpy as np
data = np.ones((300,1)), np.ones((300,5)), np.ones((300,3))

result = np.vstack(data[-1])

print(result.shape)

两者都会产生(300, 3)作为输出。

如果您正在寻找(300, 9),则可以执行以下操作:

result = np.hstack(data)

最后,如果您希望结果位于list()而不是numpy.arraynumpy.matrix,那么您可以将.tolist()粘贴到最后,像这样:result.tolist()