我想矢量化一個函式,該函式將一些簡單的過濾邏輯應用于 numpy 陣列:
import numpy
def func(arr, a, b):
sub = arr[arr[:,a] > b]
mean = numpy.mean(sub, axis=0)
return mean
a = numpy.array([0,1,2])
b = numpy.array([0,2,0])
arr = numpy.array([[0,2,3],[4,4,0]])
out = map(func, arr, a, b)
print(list(out))
但是,這會引發錯誤:
sub = arr[arr[:,a] > b] IndexError: too many indices for array
這似乎中斷了,因為它沒有正確利用map和迭代串列a和b. 如何使用 numpy 陣列和串列作為map函式的輸入?
在這里,我的預期輸出應該是一個陣列陣列(3 個陣列長),每個陣列都是陣列的平均值——請注意,我想要執行的實際邏輯比僅僅計算平均值更復雜,但這應該能說明問題.
uj5u.com熱心網友回復:
檢查是什么map喂養你的func:
In [31]: def func(arr, a, b):
...: print(arr,a,b)
...: return 1
...:
...:
In [32]: a = numpy.array([0,1,2])
...: b = numpy.array([0,2,0])
...: arr = numpy.array([[0,2,3],[4,4,0]])
...:
...: out = map(func, arr, a, b)
...: list(out)
[0 2 3] 0 0
[4 4 0] 1 2
Out[32]: [1, 1]
轉置arr所以它是 (3,2)
...: out = map(func, arr.T, a, b)
...: list(out)
[0 4] 0 0
[2 4] 1 2
[3 0] 2 0
Out[33]: [1, 1, 1]
它迭代所有引數,而不僅僅是aand b。并使用最短的。
這是我們從中得到的相同型別的迭代zip:
In [34]: list(zip(arr,a,b))
Out[34]: [(array([0, 2, 3]), 0, 0), (array([4, 4, 0]), 1, 2)]
In [35]: list(zip(arr.T,a,b))
Out[35]: [(array([0, 4]), 0, 0), (array([2, 4]), 1, 2), (array([3, 0]), 2, 0)]
離開arr地圖之外,將其視為全域:
In [36]: def func(a, b):
...: sub = arr[arr[:,a] > b]
...: mean = numpy.mean(sub, axis=0)
...: return mean
...:
In [37]: list(map(func,a,b))
Out[37]: [array([4., 4., 0.]), array([4., 4., 0.]), array([0., 2., 3.])]
map 檔案:
map(func, *iterables) --> map object
Make an iterator that computes the function using arguments from
each of the iterables. Stops when the shortest iterable is exhausted.
讓我們添加一個列印來更清楚地了解您的 func 正在做什么:
In [56]: def func(a, b):
...: sub = arr[arr[:,a] > b]
...: print(a,b,sub)
...: mean = numpy.mean(sub, axis=0)
...: return mean
...:
In [57]: list(map(func,a,b))
0 0 [[4 4 0]]
1 2 [[4 4 0]]
2 0 [[0 2 3]]
Out[57]: [array([4., 4., 0.]), array([4., 4., 0.]), array([0., 2., 3.])]
使用該索引sub是一個 (1,3) 陣列,所以它mean可以做任何有趣的事情
洗掉axis,它更有趣:
In [59]: def func(a, b):
...: sub = arr[arr[:,a] > b]
...: print(a,b,sub)
...: mean = numpy.mean(sub)
...: return mean
...:
...:
In [60]: list(map(func,a,b))
0 0 [[4 4 0]]
1 2 [[4 4 0]]
2 0 [[0 2 3]]
Out[60]: [2.6666666666666665, 2.6666666666666665, 1.6666666666666667]
這種索引arr選擇整行,在這種情況下是第 2 次 2 次,第 1 次。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/322019.html
上一篇:串列元組表示
