【问题标题】:numpy array 1.9.2 getting ValueError: could not broadcast input array from shape (4,2) into shape (4)numpy 数组 1.9.2 获取 ValueError:无法将输入数组从形状(4,2)广播到形状(4)
【发布时间】:2015-10-02 14:35:26
【问题描述】:

以下代码在 numpy 1.7.1 中运行,但在当前版本中给出值错误。我想知道它的根本原因。

    import numpy as np
    x = [1,2,3,4]
    y = [[1, 2],[2, 3], [1, 2],[2, 3]]

    a = np.array([x, np.array(y)])

以下是我在 numpy 1.7.1 中得到的输出

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

但相同的代码在 1.9.2 版本中会产生错误。

    ----> 5 a = np.array([x, np.array(y)])

ValueError: could not broadcast input array from shape (4,2) into shape (4) 

我找到了一种可能的解决方案。但我不知道这是否是最好的做法。

b= np.empty(2, dtype=object)
b[:] = [x, np.array(y)]

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

请提出一个解决方案来实现所需的输出。谢谢

【问题讨论】:

  • 它在1.7.1 中“工作”时的结果是什么?你期待它做什么?
  • a = 行应该是 a = np.array(x) + np.array(y) 吗?否则我会得到ValueError: setting an array element with a sequence.
  • 你应该使用 np.dstack 或 np.hstack 来完成这个任务
  • @tom 数组的第一个元素可以是名称,第二个元素可以是坐标等值。我之前使用过 numpy 数组,它返回的是一个 numpy 数组。
  • 你应该马上告诉我们x 可能是名字。这意味着结果必须是对象 dtype。您的示例使我们走错了路,试图堆叠列表。

标签: python numpy


【解决方案1】:

您到底想生产什么?我没有 1.7 版本来测试您的示例。

np.array(x) 产生一个(4,) 数组。 np.array(y)(4,2)。

如评论中所述,在 1.8.1 np.array([x, np.array(y)]) 中产生

ValueError: setting an array element with a sequence.

我可以制作一个object dtype数组,由列表和数组组成

In [90]: np.array([x, np.array(y)],dtype=object)
Out[90]: 
array([[1, 2, 3, 4],
       [array([1, 2]), array([2, 3]), array([1, 2]), array([2, 3])]], dtype=object)

我还可以将 2 个数组连接成一个 (4,3) 数组(x 是第一列)

In [92]: np.concatenate([np.array(x)[:,None],np.array(y)],axis=1)
Out[92]: 
array([[1, 1, 2],
       [2, 2, 3],
       [3, 1, 2],
       [4, 2, 3]])

np.column_stack([x,y]) 做同样的事情。


奇怪的是,在 dev 1.9(我没有安装生产 1.9.2)中它可以工作(有点)

In [9]: np.__version__
Out[9]: '1.9.0.dev-Unknown'

In [10]: np.array([x,np.array(y)])
Out[10]: 
array([[        1,         2,         3,         4],
       [174420780, 175084380,  16777603,         0]])
In [11]: np.array([x,np.array(y)],dtype=object)
Out[11]: 
array([[1, 2, 3, 4],
   [None, None, None, None]], dtype=object)
In [16]: np.array([x,y],dtype=object)
Out[16]: 
array([[1, 2, 3, 4],
   [[1, 2], [2, 3], [1, 2], [2, 3]]], dtype=object)

所以看起来有某种发展正在进行中。

在任何情况下,从这个列表中创建一个新数组和一个二维数组都是模棱两可的。使用column_stack(假设你想要一个二维整数数组)。


numpy 1.9.0 发行说明:

改进了使用 np.array 将包含数组的列表转换为数组的性能。现在它的速度与 np.vstack(list) 相当。

转置y vstack 有效:

In [125]: np.vstack([[1,2,3,4],np.array([[1,2],[2,3],[1,2],[2,3]]).T])
Out[125]: 
array([[1, 2, 3, 4],
       [1, 2, 1, 2],
       [2, 3, 2, 3]])

如果 1.7.1 有效,并且 x 是字符串名称,而不仅仅是您的示例中的整数,那么它可能正在生成一个对象数组。

【讨论】:

  • 我也遇到了 ValueError: setting an array element with a sequence。并通过将 dptye 设置为对象来解决相同的问题。我有一个项目是在 numpy 1.7.1 上开发的,在很多地方我们都以上述格式返回了结果。其中第一个元素可以是点的名称,第二个可以是每个点的坐标。之前我们得到一个 numpy 数组,但现在我们有值错误。
  • 一种可能的解决方案是不使用 numpy 数组,我们可以使用 list,但是我们将不得不在很多地方更改实现,我们将这个返回值视为一个数组。但我想知道一种可以在所有地方应用的修复程序。谢谢
  • 我发现了一个可能导致您的错误的 numpy 更改的引用 - np.array 已被重写以将您的情况视为 vstack。
  • 我已经编辑了我的问题以包含使用以前版本获得的结果,并找到了一种可能的解决方案。你能不能复习一下。谢谢
  • stackoverflow.com/questions/32930449/preallocating-ndarrays - 我在创建列表对象数组方面做了一些时间测试。我没有测试您的方法(将整个列表分配给预定义的数组),但我怀疑它同样快。在这种情况下,它可能是最强大的。
猜你喜欢
  • 2021-06-20
  • 2018-06-30
  • 2018-06-08
  • 2020-01-21
  • 2020-10-18
  • 2018-09-25
  • 2018-04-21
  • 2020-10-09
  • 2021-03-30
相关资源
最近更新 更多