Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对二维数组列的操作_Python_Arrays_2d - Fatal编程技术网

Python 对二维数组列的操作

Python 对二维数组列的操作,python,arrays,2d,Python,Arrays,2d,我想知道是否可以对Python2D数组中的列应用一个函数(或者只是一个操作,比如替换值),而不使用for循环 如果这个问题已经被问到了,我很抱歉,但是我找不到任何关于我的问题的具体信息 我想做一些类似的事情: array[:][2] = 1 这意味着在第三列中为每个值加1,或者 这意味着对数组的第三列应用func() 有什么神奇的python方法可以做到这一点吗 编辑:真相已经说出来了。我忘了说我不想避免使用for()语句来提高性能,只是因为我不想为这个精确的实例添加多行代码。我们在这里得到了

我想知道是否可以对Python2D数组中的列应用一个函数(或者只是一个操作,比如替换值),而不使用for循环

如果这个问题已经被问到了,我很抱歉,但是我找不到任何关于我的问题的具体信息

我想做一些类似的事情:

array[:][2] = 1
这意味着在第三列中为每个值加1,或者

这意味着对数组的第三列应用
func()

有什么神奇的python方法可以做到这一点吗


编辑:真相已经说出来了。我忘了说我不想避免使用
for()
语句来提高性能,只是因为我不想为这个精确的实例添加多行代码。我们在这里得到了两个答案,一个是土生土长的,另外两个是在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]])
你可以找到更多的细节。如前所述,对于numpy阵列,请务必小心

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


这就是为什么在函数中更改切片数组时,实际数组发生了更改。

如果不使用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()

演示:

请注意,由于在Python3.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)]

您可以将函数映射到每个列

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

它不用于,但它会遍历列表,这比numpy解决方案需要更多的时间。无论如何,回答得很好。因为我想使用原生Python,这是对我来说最好的解决方案。谢谢!很抱歉耽搁了这么久,但我想知道一些事情。在游戏中使用numpy、scipy等库是否是一种良好的做法?这个数组问题与2d游戏的地图初始化有关,但我想知道使用科学库来减轻代码的负担是否“好”。
>>> l=[range(4) for _ in range(3)]
>>> replacer(l,2,'*')
[(0, 1, '*', 3), (0, 1, '*', 3), (0, 1, '*', 3)]
>>> 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]]