对二维数组列的操作
Operation on 2d array columns
我想知道是否可以在不使用 for 循环的情况下对 python 二维数组中的列应用一个函数(或仅执行一个操作,例如替换值)。
如果这个问题已经被问到,我很抱歉,但我找不到任何关于我的问题的具体信息。
我想做类似的事情:
array[:][2] = 1
这意味着为第三列的每个值输入 1,或
func(array[:][2])
这意味着将func()
应用于数组的第三列。
有什么神奇的python方法可以做到吗?
编辑:实话实说。我忘了说我不想避免使用 for()
语句来提高性能,只是因为我不想为这个精确的实例添加多行。我们在这里得到了 2 个答案,一个是原生的,另外两个是在 Numpy 的帮助下。非常感谢您的回答!
您可以使用 numpy
数组轻松完成此操作。示例 -
In [2]: import numpy as np
In [3]: na = np.array([[1,2,3],[3,4,5]])
In [4]: na
Out[4]:
array([[1, 2, 3],
[3, 4, 5]])
In [5]: na[:,2] = 10
In [6]: na
Out[6]:
array([[ 1, 2, 10],
[ 3, 4, 10]])
In [7]: na[:,2]
Out[7]: array([10, 10])
In [8]: def func(a):
...: for i,x in enumerate(a):
...: a[i] = x + 1
...:
In [9]: na
Out[9]:
array([[ 1, 2, 10],
[ 3, 4, 10]])
In [10]: func(na[:,1])
In [11]: na
Out[11]:
array([[ 1, 3, 10],
[ 3, 5, 10]])
您可以找到有关此内容的更多详细信息here . Please do be careful , for numpy arrays, as stated in documentation -
All arrays generated by basic slicing are always views of the original array.
这就是为什么在函数内更改切片数组时,实际数组发生更改的原因。
没有 numpy 可以这样做:
map(lambda x: x[:2] + [1] + x[3:], array)
map(lambda x: x[:2] + my_func(x[2]) + x[3:], array)
在 numpy 中会非常简单,你可以通过简单的赋值来完成:
>>> numpy.array[:,column_number]=value
但如果您正在寻找 python 方法,您可以使用 zip
函数和 itertools.repeat()
:
>>> from itertools import repeat
>>> def replacer(l,index,value):
... z=zip(*l)
... z[index]=list(repeat(value,len(l)))
... return zip(*z)
演示:
>>> l=[range(4) for _ in range(3)]
>>> replacer(l,2,'*')
[(0, 1, '*', 3), (0, 1, '*', 3), (0, 1, '*', 3)]
请注意,由于在 python 3.X zip
return 中,您可以使用 list
函数来 return 一个列表由于迭代器不支持函数内的索引,因此您也需要调用列表。
>>> def replacer(l,index,value):
... z=list(zip(*l))
... z[index]=list(repeat(value,len(l)))
... return zip(*z)
>>> list(replacer(l,2,'*'))
[(0, 1, '*', 3), (0, 1, '*', 3), (0, 1, '*', 3)]
您可以将函数映射到每一列....
ar = [[1,2,3],
[3,4,5],
[3,4,5],
[3,4,5],
[3,4,5]]
if you want change second column to 100:
def column_change(l,n =1 , m =100):
l[n] = m
return l
print(list(map(colum_change,ar)))
[[1, 100, 3], [3, 100, 5], [3, 100, 5], [3, 100, 5], [3, 100, 5]]
我想知道是否可以在不使用 for 循环的情况下对 python 二维数组中的列应用一个函数(或仅执行一个操作,例如替换值)。
如果这个问题已经被问到,我很抱歉,但我找不到任何关于我的问题的具体信息。
我想做类似的事情:
array[:][2] = 1
这意味着为第三列的每个值输入 1,或
func(array[:][2])
这意味着将func()
应用于数组的第三列。
有什么神奇的python方法可以做到吗?
编辑:实话实说。我忘了说我不想避免使用 for()
语句来提高性能,只是因为我不想为这个精确的实例添加多行。我们在这里得到了 2 个答案,一个是原生的,另外两个是在 Numpy 的帮助下。非常感谢您的回答!
您可以使用 numpy
数组轻松完成此操作。示例 -
In [2]: import numpy as np
In [3]: na = np.array([[1,2,3],[3,4,5]])
In [4]: na
Out[4]:
array([[1, 2, 3],
[3, 4, 5]])
In [5]: na[:,2] = 10
In [6]: na
Out[6]:
array([[ 1, 2, 10],
[ 3, 4, 10]])
In [7]: na[:,2]
Out[7]: array([10, 10])
In [8]: def func(a):
...: for i,x in enumerate(a):
...: a[i] = x + 1
...:
In [9]: na
Out[9]:
array([[ 1, 2, 10],
[ 3, 4, 10]])
In [10]: func(na[:,1])
In [11]: na
Out[11]:
array([[ 1, 3, 10],
[ 3, 5, 10]])
您可以找到有关此内容的更多详细信息here . Please do be careful , for numpy arrays, as stated in documentation -
All arrays generated by basic slicing are always views of the original array.
这就是为什么在函数内更改切片数组时,实际数组发生更改的原因。
没有 numpy 可以这样做:
map(lambda x: x[:2] + [1] + x[3:], array)
map(lambda x: x[:2] + my_func(x[2]) + x[3:], array)
在 numpy 中会非常简单,你可以通过简单的赋值来完成:
>>> numpy.array[:,column_number]=value
但如果您正在寻找 python 方法,您可以使用 zip
函数和 itertools.repeat()
:
>>> from itertools import repeat
>>> def replacer(l,index,value):
... z=zip(*l)
... z[index]=list(repeat(value,len(l)))
... return zip(*z)
演示:
>>> l=[range(4) for _ in range(3)]
>>> replacer(l,2,'*')
[(0, 1, '*', 3), (0, 1, '*', 3), (0, 1, '*', 3)]
请注意,由于在 python 3.X zip
return 中,您可以使用 list
函数来 return 一个列表由于迭代器不支持函数内的索引,因此您也需要调用列表。
>>> def replacer(l,index,value):
... z=list(zip(*l))
... z[index]=list(repeat(value,len(l)))
... return zip(*z)
>>> list(replacer(l,2,'*'))
[(0, 1, '*', 3), (0, 1, '*', 3), (0, 1, '*', 3)]
您可以将函数映射到每一列....
ar = [[1,2,3],
[3,4,5],
[3,4,5],
[3,4,5],
[3,4,5]]
if you want change second column to 100:
def column_change(l,n =1 , m =100):
l[n] = m
return l
print(list(map(colum_change,ar)))
[[1, 100, 3], [3, 100, 5], [3, 100, 5], [3, 100, 5], [3, 100, 5]]