我知道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
视图是非常有用的,并且很好地使用它们可以帮助节省相当多的内存,但是在您的情况下,我认为视图不合适。虽然视图确实重用底层数据,但我不会将其称为指针。每个视图都是唯一的ndarray对象,这意味着它有自己的属性,例如shape:
因此,当您执行
^{pr2}$b = a[0:1]
操作时,您正在创建一个全新的ndarray对象来保存一个int/float/。。。或者别的什么。如果您希望为数组中的每个元素指定有意义的名称,那么您可能不会比:也就是说,你应该试试看是否有更好的方法将你的代码矢量化,这意味着试着把你的代码写成数组上的操作,而不是数组元素上的操作。例如,您可以写下:
矢量化代码在使用numpy时可以快得多。在这个例子中,我们还利用了numpy的广播,我觉得这很令人困惑,直到我对它有了更好的了解,并意识到它有多有用。在
您几乎已经有了它,但是下面是如何创建单个元素的视图:
这里}中的相应位置。在
a
是v
的第四个元素的视图,所以当你改变a
时,你就改变了{相关问题 更多 >
编程相关推荐