在行上应用映射函数



我想在2d数组的行上应用map函数。

:

[['1', 'apple'], ['2', 'banana']]

[[1, 'apple'], [2, 'banana']]

numpy.apply_along_axis工作,但想知道使用map()函数

你可以这样做:

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']]

您仍然映射整个行,但是您映射的函数将返回一个包含原始行未动部分的新行。

>>> list(map(lambda row: [int(row[0]), row[1]], [['1', 'apple'], ['2', 'banana']]))
[[1, 'apple'], [2, 'banana']]

由于嵌套列表不是一个单一的数据结构(它是一个列表的列表),因此没有办法只对进行映射,因为没有显式的列对象可以操作。

map,您可能知道,迭代iterable并以当前元素作为参数运行给定的函数,并返回该函数的结果。

因此,要对2D数组使用map,首先要创建一个函数,该函数接受父1D数组的每个元素作为参数。

考虑到您的示例中数组为[['1', 'apple'], ['2', 'banana']]

def map_function(item):
return [int(item[0], item[1])]

现在map将传递1D数组的每个元素i,e。['1', 'apple'],['2', 'banana'],依次转换为map_function,进而将传递列表中的0th元素转换为int

现在只需将此函数与2D数组一起传递给map

2D_array = [['1', 'apple'], ['2', 'banana']]
resultant_2D = list(map(map_function, 2D_array))
# [[1, 'apple'], [2, 'banana']]

@chepner的解决方案使用lambda或匿名函数而不是定义函数来使代码简洁,但它都是一样的:)

使用其他答案中所示的辅助函数的map方法是最好的,并且适用于列表的列表(与数组一样好,如果不是更好的话)。

apply_along_axis是在迭代器中,因此不会添加任何重要的内容,特别是当应用于2d数组时。对行进行简单迭代,无论是使用map还是列表推导式,都一样好,甚至更好。

但如果它确实是一个2d数组,而不是列表的列表,还有另一个选项:

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)

我们可以访问一个列,并且作为对象dtype,在适当的地方修改它:

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)

我提出这个问题更多的是为了教育目的,而不是作为一个实际的解决方案。

最新更新