我想對map二維陣列中的行應用函式。
像這樣:
[['1', 'apple'], ['2', 'banana']]
到
[[1, 'apple'], [2, 'banana']]
numpy.apply_along_axis有效,但想知道使用map()功能。
uj5u.com熱心網友回復:
你可以做:
lst = [['1', 'apple'], ['2', 'banana']]
[*map(lambda x: [int(x[0]), x[1]], lst)]
# [[1, 'apple'], [2, 'banana']]
但我從不認為這特別好或可讀。將此與理解進行比較
[[int(a), b] for a, b in lst]
# [[1, 'apple'], [2, 'banana']]
uj5u.com熱心網友回復:
您仍然映射整行,但您映射的函式將回傳一個新行,其中包含原始未觸及的部分。
>>> list(map(lambda row: [int(row[0]), row[1]], [['1', 'apple'], ['2', 'banana']]))
[[1, 'apple'], [2, 'banana']]
由于嵌套串列不是單個資料結構(它是串列的串列),因此無法僅映射列,因為沒有顯式的列物件可供操作。
uj5u.com熱心網友回復:
map,如您所知,迭代 aiterable并以當前元素作為引數運行給定函式,并回傳該函式的結果。
所以要在二維陣列中使用 map,首先創建一個函式,將父一維陣列的每個元素作為引數。
考慮你的例子與陣列 [['1', 'apple'], ['2', 'banana']]
def map_function(item):
return [int(item[0], item[1])]
現在 map 將傳遞一維陣列的每個元素,即 ['1', 'apple'], ['2', 'banana'], map_function, , 依次將0th傳遞的串列中的元素轉換為int.
現在只需將此函式map與2D陣列一起傳遞。
2D_array = [['1', 'apple'], ['2', 'banana']]
resultant_2D = list(map(map_function, 2D_array))
# [[1, 'apple'], [2, 'banana']]
@chepner 的解決方案使用lambdaor 匿名函式而不是定義一個函式來使代碼簡潔,但它的作業原理都是一樣的:)
uj5u.com熱心網友回復:
map使用其他答案中所示的輔助函式的方法是最好的,并且適用于串列串列(如果不是更好,則與陣列一樣)。
apply_along_axis在迭代器中,所以不會添加任何重要的東西,尤其是在應用于二維陣列時。行上的簡單迭代,無論是 withmap還是 list comprehension 都一樣好,甚至更好。
但是如果它真的是一個二維陣列,而不是一個串列串列,還有另一種選擇:
In [99]: alist = [['1', 'apple'], ['2', 'banana']]
In [100]: arr = np.array(alist)
In [101]: arr
Out[101]:
array([['1', 'apple'],
['2', 'banana']], dtype='<U6')
實際上它需要物件 dtype,因為結果將包含 int 和 string 的混合。這讓我們回到串列串列。無論如何:
In [102]: arr = np.array(alist, object)
In [103]: arr
Out[103]:
array([['1', 'apple'],
['2', 'banana']], dtype=object)
我們可以訪問一列,并且作為物件資料型別,就地更改它:
In [104]: arr[:,0]
Out[104]: array(['1', '2'], dtype=object)
In [105]: arr[:,0].astype(int)
Out[105]: array([1, 2])
In [106]: arr[:,0] = arr[:,0].astype(int)
In [107]: arr
Out[107]:
array([[1, 'apple'],
[2, 'banana']], dtype=object)
我提出這個更多是為了教育目的,而不是作為一個實際的解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/338749.html
上一篇:如何通過二維陣列索引使用?
