在2d阵列列上操作

问题描述 投票:9回答:4

我想知道是否有可能在不使用for循环的情况下将函数(或juste操作,例如替换值)应用于python 2d数组中的列。

如果已经提出这个问题,我很抱歉,但我找不到任何有关我问题的具体信息。

我想做点什么:

array[:][2] = 1

这意味着在第三列中为每个值加1,或者

func(array[:][2])

这意味着将func()应用于数组的第三列。

有没有神奇的蟒蛇方式呢?

编辑:事实已经说过了。我忘了说我不想避免使用for()声明来提高性能,但仅仅因为我不想为这个精确的实例添加多行。我们在这里得到了2个答案,一个是本地方式,另外两个是在Numpy的帮助下。非常感谢你的回答 !

python arrays 2d
4个回答
7
投票

没有numpy它可以这样做:

map(lambda x: x[:2] + [1] + x[3:], array)

map(lambda x: x[:2] + my_func(x[2]) + x[3:], array)

7
投票

您可以使用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的信息。请注意,对于numpy数组,如in documentation -所述

通过基本切片生成的所有数组始终是原始数组的views

这就是为什么在更改函数内部的切片数组时,实际数组已更改。


2
投票

在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返回一个迭代器,你可以使用list函数返回一个列表,因为迭代器不支持在你需要调用列表的函数内部进行索引。

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

2
投票

你可以将函数映射到每一列....

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]]
© www.soinside.com 2019 - 2024. All rights reserved.