JoV*_*oVe 13 python numpy concatenation
在这种情况下,使用像numpy.r_或numpy.c_这样的对象比使用concatenate或vstack这样的函数更好(更高效,更合适)?
我试图理解程序员编写的代码:
return np.r_[0.0, 1d_array, 0.0] == 2
Run Code Online (Sandbox Code Playgroud)
where 1d_array是一个数组,其值可以是0,1或2.为什么不使用np.concatenate(例如)?喜欢 :
return np.concatenate([[0.0], 1d_array, [0.0]]) == 2
Run Code Online (Sandbox Code Playgroud)
它更具可读性,显然它做同样的事情.
hpa*_*ulj 23
np.r_在numpy/lib/index_tricks.py文件中实现.这是纯Python代码,没有特殊编译的东西.所以它不会比书面的任何等同快concatenate,arange和linspace.只有当符号符合您的思维方式和需求时,它才有用.
在您的示例中,它只保存将标量转换为列表或数组:
In [452]: np.r_[0.0, np.array([1,2,3,4]), 0.0]
Out[452]: array([ 0., 1., 2., 3., 4., 0.])
Run Code Online (Sandbox Code Playgroud)
相同参数的错误:
In [453]: np.concatenate([0.0, np.array([1,2,3,4]), 0.0])
...
ValueError: zero-dimensional arrays cannot be concatenated
Run Code Online (Sandbox Code Playgroud)
正确添加[]
In [454]: np.concatenate([[0.0], np.array([1,2,3,4]), [0.0]])
Out[454]: array([ 0., 1., 2., 3., 4., 0.])
Run Code Online (Sandbox Code Playgroud)
hstack通过传递所有参数来处理这个问题[atleast_1d(_m) for _m in tup]:
In [455]: np.hstack([0.0, np.array([1,2,3,4]), 0.0])
Out[455]: array([ 0., 1., 2., 3., 4., 0.])
Run Code Online (Sandbox Code Playgroud)
所以至少在简单的情况下它最相似hstack.
但是r_当你想要使用范围时,真正有用
np.r_[0.0, 1:5, 0.0]
np.hstack([0.0, np.arange(1,5), 0.0])
np.r_[0.0, slice(1,5), 0.0]
Run Code Online (Sandbox Code Playgroud)
r_允许您使用:索引中使用的语法.那是因为它实际上是一个具有__getitem__方法的类的实例. index_tricks多次使用这种编程技巧.
他们被其他的哨声吹响了
使用imaginary步骤,用于np.linspace扩展切片而不是np.arange.
np.r_[-1:1:6j, [0]*3, 5, 6]
Run Code Online (Sandbox Code Playgroud)
生产:
array([-1. , -0.6, -0.2, 0.2, 0.6, 1. , 0. , 0. , 0. , 5. , 6. ])
Run Code Online (Sandbox Code Playgroud)
文档中有更多详细信息.
我在/sf/answers/2633758081/中为许多切片做了一些时间测试
我对这个问题也很感兴趣,并比较了
numpy.c_[a, a]
numpy.stack([a, a]).T
numpy.vstack([a, a]).T
numpy.column_stack([a, a])
numpy.concatenate([a[:,None], a[:,None]], axis=1)
Run Code Online (Sandbox Code Playgroud)
所有输入向量都做同样的事情a。这是我发现的(使用perfplot):
对于较小的数字,numpy.concatenate获胜者;对于较大的数字(约3000起)stack/ vstack。
该情节是用创建的
import numpy
import perfplot
perfplot.show(
setup=lambda n: numpy.random.rand(n),
kernels=[
lambda a: numpy.c_[a, a],
lambda a: numpy.stack([a, a]).T,
lambda a: numpy.vstack([a, a]).T,
lambda a: numpy.column_stack([a, a]),
lambda a: numpy.concatenate([a[:, None], a[:, None]], axis=1),
],
labels=["c_", "stack", "vstack", "column_stack", "concat"],
n_range=[2 ** k for k in range(22)],
xlabel="len(a)",
logx=True,
logy=True,
)
Run Code Online (Sandbox Code Playgroud)
您需要的所有解释:
https://sourceforge.net/p/numpy/mailman/message/13869535/
我发现最相关的部分是:
"""
For r_ and c_ I'm summarizing, but effectively they seem to be doing
something like:
r_[args]:
concatenate( map(atleast_1d,args),axis=0 )
c_[args]:
concatenate( map(atleast_1d,args),axis=1 )
c_ behaves almost exactly like hstack -- with the addition of range
literals being allowed.
r_ is most like vstack, but a little different since it effectively
uses atleast_1d, instead of atleast_2d. So you have
>>> numpy.vstack((1,2,3,4))
array([[1],
[2],
[3],
[4]])
but
>>> numpy.r_[1,2,3,4]
array([1, 2, 3, 4])
"""
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4401 次 |
| 最近记录: |