在我目前的工作中,我使用Numpy和列表理解很多,为了最好的表现,我有以下问题:
如果我按如下方式创建Numpy数组,幕后实际发生了什么?:
a = numpy.array( [1,2,3,4] )
Run Code Online (Sandbox Code Playgroud)
我的猜测是python首先创建一个包含值的普通列表,然后使用列表大小来分配一个numpy数组,然后将值复制到这个新数组中.这是正确的,还是解释器聪明到足以意识到列表只是中介而是直接复制值?
同样,如果我希望使用numpy.fromiter()从列表理解中创建一个numpy数组:
a = numpy.fromiter( [ x for x in xrange(0,4) ], int )
Run Code Online (Sandbox Code Playgroud)
这会导致在被送入fromiter()之前创建的值的中间列表吗?
最好的问候尼尔斯
我试图通过在Cython中实现它来优化Python算法.我的问题是关于以下代码中存在的某个性能瓶颈:
@cython.boundscheck(False) # turn off bounds-checking for entire function
def anglesToRGB( np.ndarray[double, ndim=2] y, np.ndarray[double, ndim=2] x ):
cdef double angle
cdef double Hp
cdef double C
cdef double X
cdef np.ndarray[double, ndim=3] res = np.zeros([y.shape[0], y.shape[1], 3], dtype=np.float64)
for i in xrange(y.shape[0]):
for j in xrange(y.shape[1]):
angle = atan2( y[i,j], x[i,j] )*180.0/PI+180
C = sqrt(pow(y[i,j],2)+pow(x[i,j],2))/360.0 #Chroma
Hp = angle/60.0
X = C*(1-fabs( Hp%2-1))
C *= 255
X *= 255
if (0. <= Hp < 1.):
res[i,j,:] = [C,X,0]
elif …Run Code Online (Sandbox Code Playgroud)