如何将引用的 numpy 数组更改为自身的一部分?

考虑以下应用于两个 numpy 数组的操作和切片:


In [1]: import numpy as np                                                                               


In [2]: a = np.array([1,2,3,4])                                                                          


In [3]: b = np.array([5,6,7,8])                                                                          


In [4]: a[2:] = 0                                                                                       


In [5]: a = a[::2]                                                                                       


In [6]: b[2:] = 0                                                                                       


In [7]: b = b[::2]                                                                                       


In [8]: a                                                                                                

Out[8]: array([1, 0])


In [9]: b                                                                                                

Out[9]: array([5, 0])

我不想重复切片代码,例如,而不是上面的第 [4]-[7] 行,我希望使用类似


In [4]: for data in [a,b] : 

   ...:     data[2:] = 0

   ...:     data = data[::2] 

我知道它不起作用,因为它的作用data = data[::2]是data指向一个新对象,而不是更改原始对象。所以 和 的值a没有b被切片:


In [5]: a                                                                                                

Out[5]: array([1, 2, 0, 0])


In [6]: b                                                                                                

Out[6]: array([5, 6, 0, 0])

我的问题是:


如何切片变量引用的numpy数组?


在我的实际应用程序中,我在每个数组中执行多个操作,并希望将它们全部放在for.


绝地无双
浏览 84回答 4
4回答

慕婉清6462132

您可以使用map映射所有变量的切片import numpy as np                                                                               a = np.array([1,2,3,4])                                                                          b = np.array([5,6,7,8])def func(x):    x[2:] = 0    x = x[::2]     return x[a,b] = list(map(func,[a,b]))print(a,b)输出:[1 0] [5 0]

呼啦一阵风

听起来你想要一本字典:import numpy as nparrs = {'a': np.array([1,2,3,4]), 'b': np.array([5,6,7,8])}arrs = {k: v[::2] for k, v in arrs.items()}print(arrs)输出:{'a': array([1, 3]), 'b': array([5, 7])}

九州编程

您可以使用列表理解:a,b = [arr[::2] for arr in [a,b]]

慕工程0101907

在创建数组对象和赋值时可能会有一些混淆。让我举例说明:定义两个数组:In [5]: a=np.arange(1,5); b=np.arange(5,10)                                     列出这两个数组:In [6]: alist = [a,b]                                                           和一个返回新数组的通用函数(它是一个视图并不重要):In [7]: def foo(i):    ...:     return i[2:]    ...:    该函数可以应用于引用的数组a:In [8]: foo(a)                                                                  Out[8]: array([3, 4])或引用的每个数组alist:In [9]: [foo(i) for i in alist]                                                 Out[9]: [array([3, 4]), array([7, 8, 9])]这些数组可以解包为变量(新名称或旧名称):In [10]: a,d = [foo(i) for i in alist]                                          In [11]: a                                                                      Out[11]: array([3, 4])          # the new sliced arrayIn [12]: b                                                                      Out[12]: array([5, 6, 7, 8, 9])    # the original arrayIn [13]: d                                                                      Out[13]: array([7, 8, 9])           # a slice of b原始数组仍然存在于alist. 具有新值的事实a不会改变alist:In [14]: alist                                                                  Out[14]: [array([1, 2, 3, 4]), array([5, 6, 7, 8, 9])]解包赋值 viamap做同样的事情:In [15]: d,e = map(foo, alist)                                                  In [16]: d,e                                                                    Out[16]: (array([3, 4]), array([7, 8, 9]))制作切片数组的字典也有效:In [17]: {key: foo(value) for key, value in zip(['e','d'],alist)}               Out[17]: {'e': array([3, 4]), 'd': array([7, 8, 9])}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python