当Numpy/Scipy指针复制到局部变量时会发生什么?

2024-05-29 06:17:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道numpy数组是指针数组。我知道在python中定义指针是可能的。但是我想知道,如果我让一个变量等于numpy向量中的一个元素,它仍然是一个指针还是被取消引用?有没有办法让我找出或测试一下?在

示例

    import scipy
    vec = scipy.randn(10)
    vecptr = vec # vecptr is a pointer to vec
    vecval = scipy.copy(vec) # vecval is not a pointer.

    var = vec[3] # is var pointer or is it copied by value ???

    print(type(var)) # returns numpy.float64.  does this mean its a 1x1 numpy vec and therefore  a pointer ?

我问的原因是,我真正想知道的是,下面的代码会不会让我的记忆加倍?我正在尝试为返回的向量创建更有意义的变量名

^{pr2}$

因为我有很多事情要做

    p0 = alpha0 + alpha1*scipy.log(bfrac) + alpha2*scipy.log(bfrac)**2
    p1 = beta0 + beta1*scipy.log(bfrac) + beta2*scipy.log(bfrac)**2 + beta3*scipy.log(bfrac)**3
    p2 = gamma0 + gamma1*scipy.log(bfrac) + gamma2*scipy.log(bfrac)**2 + gamma3*scipy.log(bfrac)**3 + gamma4*scipy.log(bfrac)**4
    p3 = delta0 + delta1*scipy.log(bfrac) + delta2*scipy.log(bfrac)**2 + delta3*scipy.log(bfrac)**3 + delta4*scipy.log(bfrac)**4 + delta5*scipy.log(bfrac)**5

    subSurfRrs = g*(p0*u + p1*u**2 + p2*u**3 + p3*u**4)
    ## and lots more

所以我想要有意义的变量名而不必加倍我的记忆足迹。在

#

好吧,如果我没弄错,解决办法是:

    v = self.veiwCoefs[sz][sv][sa]

    gw = v[0:1]
    G0 = v[1:2]
    G1 = v[2:1]
    alpha0 = v[3:4]
    alpha1 = v[4:5]
    alpha2 = v[5:6]
    beta0 = v[6:7]
    beta1 = v[7:8]
    beta2 = v[8:9]
    beta3 = v[9:10]
    ## etc 

    p0 = alpha0[0] + alpha1*scipy.log(bfrac) + alpha2[0]*scipy.log(bfrac)**2
    p1 = beta0[0] + beta1[0]*scipy.log(bfrac) + beta2[0]*scipy.log(bfrac)**2 + beta3[0]*scipy.log(bfrac)**3

    ## etc

Tags: numpylogisvarscipy指针p1alpha2
2条回答

视图是非常有用的,并且很好地使用它们可以帮助节省相当多的内存,但是在您的情况下,我认为视图不合适。虽然视图确实重用底层数据,但我不会将其称为指针。每个视图都是唯一的ndarray对象,这意味着它有自己的属性,例如shape:

In [4]: a = np.arange(7)

In [5]: b = a[1:5]

In [6]: b.shape = (2,2)

In [7]: b
Out[7]: 
array([[1, 2],
       [3, 4]])
In [8]: a.shape
Out[8]: (7,)

因此,当您执行b = a[0:1]操作时,您正在创建一个全新的ndarray对象来保存一个int/float/。。。或者别的什么。如果您希望为数组中的每个元素指定有意义的名称,那么您可能不会比:

^{pr2}$

也就是说,你应该试试看是否有更好的方法将你的代码矢量化,这意味着试着把你的代码写成数组上的操作,而不是数组元素上的操作。例如,您可以写下:

coefs = np.zeros((5,5))
lt = np.tril_indices(5)
coefs[lt] = self.viewCoefs[sz][sv][sa]

p = (coefs * scipy.log(bfrac)**[1, 2, 3, 4, 5]).sum(-1)
subSurfRrs = g*(p*u**[1, 2, 3, 4]).sum()

矢量化代码在使用numpy时可以快得多。在这个例子中,我们还利用了numpy的广播,我觉得这很令人困惑,直到我对它有了更好的了解,并意识到它有多有用。在

您几乎已经有了它,但是下面是如何创建单个元素的视图:

In [1]: import numpy as np

In [23]: v = np.arange(10)

In [24]: a = v[3:4]

In [25]: a[0] = 100

In [26]: v
Out[26]: array([  0,   1,   2, 100,   4,   5,   6,   7,   8,   9])

这里av的第四个元素的视图,所以当你改变a时,你就改变了{}中的相应位置。在

相关问题 更多 >

    热门问题