簡體   English   中英

為什么我不能用標量除(或乘)一個 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]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM