【问题标题】:ValueError: setting an array element with a sequence on numpy arrayValueError:在numpy数组上设置具有序列的数组元素
【发布时间】:2020-08-21 17:42:13
【问题描述】:

这是一个大数组的简单例子

   x = [[[1,2,3], "abs"], [[1,2,3], "abs"]]
   y = np.array(x)
   z = y[:, 0]
   z.astype('int') # This will throw an error

输出

z >> Out[9]: array([list([1, 2, 3]), list([1, 2, 3])], dtype=object)

有什么方法可以在不对列表 x 进行迭代的情况下将它从 object 转换为 int

【问题讨论】:

  • 试试np.vstack(z)
  • 听起来不错。非常感谢

标签: python numpy


【解决方案1】:

我搜索了你的问题,发现:Using Numpy Vectorize on Functions that Return Vectors

所以我猜你可以使用矢量化方法:

import numpy as np
x = [[[1,2,3], "abs"], [[1,2,3], "abs"]]
y = np.array(x)
z = y[:, 0]
def f(l):
    return np.array(l)

v = np.vectorize(f, signature='()->(n)')
k = v(z)

k 设为:

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

@hpaulj 还提出了一种使用np.vstack(z) 的更简洁的方法,它给出了相同的答案。

根据文档,vstack 的参数应该是“ndarrays 序列”,所以我认为传递一系列列表并不完全正确,但我可以确认它确实有效。


最后,如果是我的代码,我会坚持简单的列表理解,这是最简单的方法,任何解决方案都必须执行某种形式的 for 循环将列表转换为 ndarray,所以为什么不只进行迭代在 Python 中。

>>> np.array([r[0] for r in x])
array([[1, 2, 3],
       [1, 2, 3]])

【讨论】:

  • 非常感谢。两种解决方案都很酷,并且 np.vstack() 也可以工作,即使它是列表序列
  • @SACHINGURUSWAMY 没问题。
猜你喜欢
  • 2017-10-20
  • 2015-12-19
  • 1970-01-01
  • 2016-01-21
  • 2023-03-16
  • 2018-04-25
  • 2018-05-09
  • 1970-01-01
  • 2013-03-12
相关资源
最近更新 更多