为什么我不能将数组的 numpy 数组除以(或乘以)标量?



我正在开发我生命中的第一个基于代理的模型(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]

它工作:CCD_ 3。

你能帮我吗?感谢

您的粗糙数组-列表数组:

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]]

相关内容

  • 没有找到相关文章

最新更新