python-在numpy ndarray中沿指定轴循环矢量的有效方法是什么?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-在numpy ndarray中沿指定轴循环矢量的有效方法是什么?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2714字,纯文字阅读大概需要4分钟。
内容图文
我通过沿numpy ndarray的轴(可以是任何轴)(可以是任何尺寸)上的向量进行循环来处理数据.
我没有直接处理数组,因为数据并不完美.它要求对每个载体进行质量控制.如果不好,向量将由零(或nan)填充,并且不进行实际处理.
我发现this Q类似,但我的问题要困难得多,因为
> ndim是任意的.
对于3D数组,我可以像这样沿1轴取向量
x = np.arange(24).reshape(2,3,4)
for i in range(x.shape[0]):
for k in range(x.shape[2]):
process(x[i,:,k])
但是如果ndim和取轴不固定,如何取向量?
>取向量的轴是任意的.
我正在考虑的一种可能方法是
y = x.swapaxes(ax,-1)
# loop over vectors along last axis
for i in np.ndindex(y.shape[:-1]):
process(y[i+(slice(None),)])
# then swap back
z = y.swapaxes(ax,-1)
但是我怀疑这种方法的效率.
解决方法:
测试效率的最佳方法是对实际示例进行时间测试.但是,对玩具示例进行%timeit(ipython)测试是一个开始.
根据回答类似“如果您必须重复”问题的经验,时间差异不大. np.frompyfunc具有适度的速度边-但其pyfunc需要标量,而不是数组或切片. (np.vectorize是此功能更好的API,但速度较慢).
但是在这里,您想将数组的一维切片传递给函数,同时遍历所有其他维.我认为替代迭代方法没有太大区别.
诸如交换轴,转置和拉动之类的动作速度很快,通常只是创建具有不同形状和步幅的新视图.
np.ndindex使用np.nditer(与multindex持平)来迭代一系列尺寸.在C代码中使用nditer时速度很快,但在Python代码中使用nditer并没有什么特别的.
np.apply_along_axis创建一个(i,j,:,k)索引元组,并逐步执行变量.这是一种很好的通用方法,但是并没有做任何特别的事情来加快速度. itertools.product是生成索引的另一种方法.
但是通常不是让速度变慢的迭代机制,而是对函数的重复调用.您可以使用平凡的功能来测试迭代机制,例如
def foo(x):
return x
===================
您无需交换轴即可使用ndindex;您可以使用它在任意轴组合上进行迭代.
例如,制作一个3d数组,并沿中间维度求和:
In [495]: x=np.arange(2*3*4).reshape(2,3,4)
In [496]: N=np.ndindex(2,4)
In [497]: [x[i,:,k].sum() for i,k in N]
Out[497]: [12, 15, 18, 21, 48, 51, 54, 57]
In [498]: x.sum(1)
Out[498]:
array([[12, 15, 18, 21],
[48, 51, 54, 57]])
我认为这不会影响速度;代码更简单.
===================
另一个可能的工具是np.ma,掩码数组.使用这些元素,您可以将单个元素标记为已屏蔽(因为它们是nan或0).它具有以求掩码值不会损害解决方案的方式评估诸如和,均值,乘积之类的代码.
再次使用3d数组:
In [517]: x=np.arange(2*3*4).reshape(2,3,4)
添加一些错误的值:
In [518]: x[1,1,2]=99
In [519]: x[0,0,:]=99
这些值弄乱了正常的总和:
In [520]: x.sum(axis=1)
Out[520]:
array([[111, 113, 115, 117],
[ 48, 51, 135, 57]])
但是如果我们屏蔽它们,它们将从解决方案中“滤除”(在这种情况下,它们会暂时设置为0)
In [521]: xm=np.ma.masked_greater(x,50)
In [522]: xm
Out[522]:
masked_array(data =
[[[-- -- -- --]
[4 5 6 7]
[8 9 10 11]]
[[12 13 14 15]
[16 17 -- 19]
[20 21 22 23]]],
mask =
[[[ True True True True]
...
[False False False False]]],
fill_value = 999999)
In [523]: xm.sum(1)
Out[523]:
masked_array(data =
[[12 14 16 18]
[48 51 36 57]],
...)
内容总结
以上是互联网集市为您收集整理的python-在numpy ndarray中沿指定轴循环矢量的有效方法是什么?全部内容,希望文章能够帮你解决python-在numpy ndarray中沿指定轴循环矢量的有效方法是什么?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。