我知道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 ?
我问的原因是,我真正想知道的是;这下面的代码会加倍我的记忆吗?我正在尝试为我的向量
创建更有意义的变量名 v = self.viewCoefs[sz][sv][sa]
gw = v[0]
G0 = v[1]
G1 = v[2]
G2 = v[3]
alpha0 = v[4]
alpha1 = v[5]
alpha2 = v[6]
beta0 = v[7]
beta1 = v[8]
beta2 = v[9]
beta3 = v[10]
gamma0 = v[11]
gamma1 = v[12]
gamma2 = v[12]
gamma3 = v[12]
gamma4 = v[13]
delta0 = v[14]
delta1 = v[15]
delta2 = v[16]
delta3 = v[17]
delta4 = v[18]
delta5 = v[19]
zeta_prime_0 = v[20]
zeta_prime_1 = v[21]
zeta_prime_2 = v[22]
Gamma_prime_0 = v[23]
Gamma_prime_1 = v[24]
Gamma_prime_2 = v[25]
Gamma_prime_3 = v[26]
因为我有很多这些要遵循
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
答案 0 :(得分:4)
你几乎拥有它,但这里是如何创建单个元素的视图:
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])
此处a
是v
的第四个元素的视图,因此当您更改a
时,您会更改v
中的相应位置。
答案 1 :(得分:1)
视图非常有用,使用它们可以帮助节省相当多的内存,但在你的情况下我不认为视图是合适的。虽然视图确实重用了底层数据,但我不会将其称为指针。每个视图都是一个唯一的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 / ...或者其他什么。如果您希望数组的每个元素都有有意义的名称,那么您可能不会比以下方法更有效:
v = self.viewCoefs[sz][sv][sa]
gw = v[0]
G0 = v[1]
G1 = v[2]
G2 = v[3]
alpha0 = v[4]
## etc
话虽这么说,你应该试着看看是否有更好的方法来对代码进行矢量化,这意味着尝试将代码编写为数组上的操作而不是对数组元素的操作。例如,您可以写:
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的广播,我认为这是非常令人困惑的,直到我更好地了解它并意识到它有多么有用。