我有一些问题。我想从另一个列表中减去一个列表。为此,我使用从python数组到numpy数组的转换。但它失败了。
例如,wealthRS
是列表。我创建了一个副本:
wealthRSCopy = wealthRS
然后我想提取,但这是错误的(unsuppoerted operand types
)
这是屏幕截图。
答案 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]]])
我无法弄清楚为什么你的减法不起作用,除非数组元素本身是列表,但我不知道这是怎么回事。