python为什么使用numpy.r_而不是连接

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,arangelinspace.只有当符号符合您的思维方式和需求时,它才有用.

在您的示例中,它只保存将标量转换为列表或数组:

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/中为许多切片做了一些时间测试


Nic*_*mer 7

我对这个问题也很感兴趣,并比较了

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)

  • 为“np._r”而来,为“perfplot”留下了:) (6认同)

piR*_*red 5

您需要的所有解释:

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)

  • 您至少应该描述该页面的内容,以防超链接中断。 (2认同)
  • 我认为将“r_”和“c_”与“vstack”和“hstack”进行比较是误导性的,甚至是错误的。在“1,2,3,4”的情况下,4 个运算分别生成形状 (4,)、(1,4)、(4,1)、(4,)。在这个简单的例子中,“r_”和“hstack”产生相同的结果,而“c_”和“vstack”是彼此的转置。 (2认同)