[英]Apply simple operation on array with sublists of unequal length
我有一個由兩個長度不等的子列表組成的列表:
a = [[0.2, 0.3], [0.6, 0.5, 0.7, 0.8]]
我需要將所有元素除以10,因此盡管我可以將a
轉換為一個numpy
數組,然后像這樣應用操作:
np.asarray(a) / 10.
但這導致:
TypeError: unsupported operand type(s) for /: 'list' and 'float'
我可以這樣做:
np.asarray([np.asarray(a[0]), np.asarray(a[1])]) / 10.
但我很確定這不是執行此操作的pythonic方法。
在具有不同長度的子列表組成的數組上應用操作的正確方法是什么?
你需要numpy
嗎? 否則,您可以使用簡單的列表理解:
b = [map(lambda x:x/10, i) for i in a]
我喜歡以下外觀:
In [273]: [(np.array(i)/10).tolist() for i in a]
Out[273]: [[0.02, 0.03], [0.06, 0.05, 0.06999999999999999, 0.08]]
簡單地將a
轉換為array是不好的,因為它將元素(其中2個)留在列表中。
In [275]: np.array(a)
Out[275]: array([[0.2, 0.3], [0.6, 0.5, 0.7, 0.8]], dtype=object)
dtype=object
數組僅是帶有數組包裝器的列表。 因此,如果要使用數組划分,則需要將子列表轉換為數組。
但是純列表理解版本看起來更干凈-以及更多的pythonic:
In [279]: [[j/10. for j in i] for i in a]
Out[279]: [[0.02, 0.03], [0.06, 0.05, 0.06999999999999999, 0.08]]
在我的書中,列表推導非常“ pythonic”。 嵌套的更是如此。 :)不必要地使用numpy
是非Python的,尤其是在需要事后tolist
。
dtype=object
數組嘗試將操作應用於每個元素,例如
np.array(a)/10 => np.array([i/10 for i in a])
由於未定義[2,3]/10
,因此在子列表中不起作用。
但是,如果我們采取額外的步驟將子列表轉換為數組:
In [282]: aa=np.array([np.array(i) for i in a])
In [283]: aa/10.
Out[283]: array([array([ 0.02, 0.03]), array([ 0.06, 0.05, 0.07, 0.08])], dtype=object)
然后數組除法起作用。 但是,不要指望這適用於所有操作。 dtype=object
數組代碼尚未完全開發。
如果您需要直接修改現有列表,則可以執行此操作。
for i1, l in enumerate(a):
for i2, _ in enumerate(l):
a[i1][i2] /= 10
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.