为什么我不能将一个 numpy 数组除以(或乘以)一个标量?
Why can't I divide (or multiply) a numpy array of arrays by a scalar?
我正在研究我生命中的第一个基于代理的模型 (abm),我必须对数组数组进行操作。我模型的每个代理都是一个数组,其中包含满足特定条件时算法添加的数字。有时我必须将所有数组除以或乘以相同的数字。我在 numpy 数组中看到我可以这样做:
vector = np.array([1, 2.1, 3])
当我做的时候
2 / vector
如我所料,array([ 2. , 0.95238095, 0.66666667])
。
但是如果我想要一个数组数组,例如
arrayofarrays = np.array([[1,2,3],[1.1,6],[1]])
它默认有 dtype=object
,我猜这是不允许我做的
2 / arrayofarrays
这给出了
unsupported operand type(s) for /: 'int' and 'list'
还有
2 / arrayofarrays[0]
给出同样的错误。
相反,如果您使用单个数组的值,如
2/arrayofarrays[0][1]
有效:1.0
.
你能帮帮我吗?谢谢
你的参差不齐的数组 - 列表数组:
In [31]: arr = np.array([[1,2,3],[1.1,6],[1]])
<ipython-input-31-4887f672b831>:1: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
arr = np.array([[1,2,3],[1.1,6],[1]])
In [32]: arr
Out[32]: array([list([1, 2, 3]), list([1.1, 6]), list([1])], dtype=object)
对象 dtype 数组的数学运算是逐个元素执行的(以列表理解速度)。它如何工作取决于相应的方法如何工作的元素:
In [33]: arr *2
Out[33]:
array([list([1, 2, 3, 1, 2, 3]), list([1.1, 6, 1.1, 6]), list([1, 1])],
dtype=object)
list*2
是复制操作,不是乘法。
In [34]: arr / 2
Traceback (most recent call last):
File "<ipython-input-34-855a165721c4>", line 1, in <module>
arr / 2
没有为列表定义除法。
TypeError: unsupported operand type(s) for /: 'list' and 'int'
我们可以对每个元素应用一个简单的函数 frompyfunc
:
In [38]: np.frompyfunc(lambda x: np.array(x)/2, 1,1)(arr)
Out[38]:
array([array([0.5, 1. , 1.5]), array([0.55, 3. ]), array([0.5])],
dtype=object)
此函数负责数组的转换和除法。
等价的列表理解(一样快):
In [40]: [np.array(x)/2 for x in arr]
Out[40]: [array([0.5, 1. , 1.5]), array([0.55, 3. ]), array([0.5])]
或纯列表版本(可能更快)
In [41]: [[y/2 for y in x] for x in arr.tolist()]
Out[41]: [[0.5, 1.0, 1.5], [0.55, 3.0], [0.5]]
我正在研究我生命中的第一个基于代理的模型 (abm),我必须对数组数组进行操作。我模型的每个代理都是一个数组,其中包含满足特定条件时算法添加的数字。有时我必须将所有数组除以或乘以相同的数字。我在 numpy 数组中看到我可以这样做:
vector = np.array([1, 2.1, 3])
当我做的时候
2 / vector
如我所料,array([ 2. , 0.95238095, 0.66666667])
。
但是如果我想要一个数组数组,例如
arrayofarrays = np.array([[1,2,3],[1.1,6],[1]])
它默认有 dtype=object
,我猜这是不允许我做的
2 / arrayofarrays
这给出了
unsupported operand type(s) for /: 'int' and 'list'
还有
2 / arrayofarrays[0]
给出同样的错误。 相反,如果您使用单个数组的值,如
2/arrayofarrays[0][1]
有效:1.0
.
你能帮帮我吗?谢谢
你的参差不齐的数组 - 列表数组:
In [31]: arr = np.array([[1,2,3],[1.1,6],[1]])
<ipython-input-31-4887f672b831>:1: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
arr = np.array([[1,2,3],[1.1,6],[1]])
In [32]: arr
Out[32]: array([list([1, 2, 3]), list([1.1, 6]), list([1])], dtype=object)
对象 dtype 数组的数学运算是逐个元素执行的(以列表理解速度)。它如何工作取决于相应的方法如何工作的元素:
In [33]: arr *2
Out[33]:
array([list([1, 2, 3, 1, 2, 3]), list([1.1, 6, 1.1, 6]), list([1, 1])],
dtype=object)
list*2
是复制操作,不是乘法。
In [34]: arr / 2
Traceback (most recent call last):
File "<ipython-input-34-855a165721c4>", line 1, in <module>
arr / 2
没有为列表定义除法。
TypeError: unsupported operand type(s) for /: 'list' and 'int'
我们可以对每个元素应用一个简单的函数 frompyfunc
:
In [38]: np.frompyfunc(lambda x: np.array(x)/2, 1,1)(arr)
Out[38]:
array([array([0.5, 1. , 1.5]), array([0.55, 3. ]), array([0.5])],
dtype=object)
此函数负责数组的转换和除法。
等价的列表理解(一样快):
In [40]: [np.array(x)/2 for x in arr]
Out[40]: [array([0.5, 1. , 1.5]), array([0.55, 3. ]), array([0.5])]
或纯列表版本(可能更快)
In [41]: [[y/2 for y in x] for x in arr.tolist()]
Out[41]: [[0.5, 1.0, 1.5], [0.55, 3.0], [0.5]]