编辑答案:
初始列表的元素是列表。这些列表的长度不同,因此强制转换为NumPy数组将生成dtype对象的数组,即数组的元素是列表。请看这里: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.
我在这里重现你的错误:
^{pr2}$
因此,您需要确保通过使每个列表的初始列表长度相等,可以将列表合理地转换为数组。然后它们应该被强制转换成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]]])
我不明白为什么你的减法不起作用,除非数组元素本身是列表,但我不知道怎么会这样。在