Python Numpy不支持的操作数类型' list' - ' list'

时间:2015-12-15 10:59:23

标签: python arrays list numpy

我有一些问题。我想从另一个列表中减去一个列表。为此,我使用从python数组到numpy数组的转换。但它失败了。 例如,wealthRS是列表。我创建了一个副本: wealthRSCopy = wealthRS 然后我想提取,但这是错误的(unsuppoerted operand types) 这是屏幕截图。enter image description here

1 个答案:

答案 0 :(得分:1)

使用回答进行编辑:

您的初始列表中包含列表作为其元素。这些列表的长度不同,因此转换为NumPy数组会生成dtype对象的数组,即数组的元素是 lists 。见这里:https://stackoverflow.com/a/33987165/4244912

当减去NumPy数组时,它会进行逐元素减法,也就是说,它会从另一个数组中的相应元素中减去一个数组的元素(在您的情况下是列表),这就是为什么您收到错误消息的原因(即类型'list'不支持减法。)

快速举例:

In [1]: import numpy as np

In [2]: A=np.array([[1,2],[],[1,2,3,4]])

In [3]: A[0]
Out[3]: [1, 2]

In [4]: A[0].append(3)    #<-- The first element is a list!

In [5]: A
Out[5]: array([[1, 2, 3], [], [1, 2, 3, 4]], dtype=object)    #<-- The first element (a list) has changed.

我在这里重现你的错误:

In [35]: B, C = np.array([[1,2],[3]]), np.array([[4,5],[6]])    # Note the differing sizes of the nested lists.

In [36]: C-B
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-36-f4554df570db> in <module>()
----> 1 C-B

TypeError: unsupported operand type(s) for -: 'list' and 'list'

因此,您需要确保通过使每个列表的初始列表长度相等,可以将列表精确地转换为数组。然后,它们应该被转换为具有dtype float类型的NumPy数组,并以您期望的方式运行。

原帖

我不认为你的代码片段创建了一个副本,看起来你仍在减去列表,而不是numpy数组。

如果wealthRS是一个列表,那么wealthRSCopy = wealthRS会创建我认为称为浅层副本的内容:列表引用相同的元素,因此更改一个将改变另一个元素。

例如:

In [1]: a = [1,2,3]

In [2]: b = a

In [3]: b[0] = 10    # change the first item in 'b'

In [4]: b
Out[4]: [10, 2, 3]

In [5]: a    # <-- 'a' has changed too!
Out[5]: [10, 2, 3]

创建彼此独立的副本的一种方法是使用切片。

In [6]: c = a[:]    # <-- slice containing the whole list

In [6]: c[0] = 15

In [7]: a
Out[7]: [10, 2, 3]

In [8]: c
Out[8]: [15, 2, 3]

编辑:对于你的其余问题:你能为我试试吗?

In [1]: import numpy as np

In [2]: a, b = [[[1]]], [[[3]]]

In [3]: np.array(b) - np.array(a)
Out[3]: array([[[2]]])

我无法弄清楚为什么你的减法不起作用,除非数组元素本身是列​​表,但我不知道这是怎么回事。