簡體   English   中英

多維數組上的 Python lambda 應用程序歧義

[英]Python lambda application ambiguity on multi-dimensional arrays

給定下面的代碼示例,一個產生預期結果,另一個給出錯誤。 對於初學者(即我)來說似乎很困惑。 我假設算術運算是明智的,但其他人則不然。 什么是“好的”(即有效的)概括方法來簡單地對多維數組的元素執行操作,而無需了解數組行為的一些基本知識?

import numpy as np

data = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(data)

my_function = lambda x: x*2+5

result = my_function(data)
print(result)

輸出:[[1 2 3 4] [5 6 7 8]] [[ 7 9 11 13] [15 17 19 21]]

import numpy as np

data = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(data)

my_function = lambda x: x if x < 3 else 0

result = my_function(data)
print(result)

ValueError:具有多個元素的數組的真值不明確。 使用 a.any() 或 a.all()

編輯:我不是在尋找特定的解決方案。 是的,對於這個確切的示例,我可以使用 np.where 或其他一些機制。 我特別詢問 lambdas 以及它們的使用對用戶來說似乎模棱兩可。 如果有幫助,lamba / 過濾器來自命令行/模塊外部。 因此,它可以是用戶想要將原始數組轉換為的任何東西——簡單的正方形元素,或者調用 API,然后使用它的輸出來確定替換值。 你明白了。

運行 python 3.9.13

這是有效的,因為像*+這樣的運算符對 numpy 數組按元素工作:

In [101]: data = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
     ...: print(data)
     ...: 
     ...: my_function = lambda x: x*2+5
     ...: 
     ...: result = my_function(data)
[[1 2 3 4]
 [5 6 7 8]]

my_function = lambda x: x if x < 3 else 0失敗,因為if x<3本質上是一個標量操作。 if/else不迭代; 它需要一個簡單的 True/False 值

In [103]: data<3
Out[103]: 
array([[ True,  True, False, False],
       [False, False, False, False]])

np.vectorize是將數組(或數組)元素應用於標量函數的最通用工具:

In [104]: f = np.vectorize(my_function, otypes=[int])

In [105]: f(data)
Out[105]: 
array([[1, 2, 0, 0],
       [0, 0, 0, 0]])

我包含了otypes參數以避免 SO 詢問的更常見的vectorize錯誤之一。

np.vectorize在小情況下比普通迭代慢,但在大情況下變得有競爭力。 但它的主要優點是它更易於用於多維數組。 當函數需要多個輸入並且您想利用廣播時,情況會更好。

暫無
暫無

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

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