为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

绝地无双 2022-12-20 16:13:24
考虑以下应用于两个 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.
查看完整描述

4 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

您可以使用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]


查看完整回答
反对 回复 2022-12-20
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

听起来你想要一本字典:


import numpy as np


arrs = {'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])}


查看完整回答
反对 回复 2022-12-20
?
九州编程

TA贡献1785条经验 获得超4个赞

您可以使用列表理解:

a,b = [arr[::2] for arr in [a,b]]


查看完整回答
反对 回复 2022-12-20
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

在创建数组对象和赋值时可能会有一些混淆。


让我举例说明:


定义两个数组:


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 array

In [12]: b                                                                      

Out[12]: array([5, 6, 7, 8, 9])    # the original array

In [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])}


查看完整回答
反对 回复 2022-12-20
  • 4 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信