迭代numpy数组

时间:2013-07-03 17:06:33

标签: python numpy multidimensional-array

我的渲染时间非常困难,我似乎无法以这种方式思考数学。我现在有这个:

#!/usr/bin/env python

import numpy as np
import math

grid = np.zeros((2,2))
aList = np.arange(1,5).reshape(2,2)

i,j = np.indices((2,2))

iArray =  (i - aList[:,0:1]) 
jArray = (j - aList[:,1:2])

print np.power(np.power(iArray, 2) + np.power(jArray, 2), .5)

我的打印出来是这样的:

[[ 2.23606798  1.41421356]
 [ 4.47213595  3.60555128]]

我要做的是采用像素值的二维数组,网格,并说明每个像素与重要像素列表aList的距离。

# # @ 
# # #
* # *

一个例子是如果* s(0,2)和(2,2)是重要像素而我目前处于@(2,0)像素,那么@像素的值将是:

[(0-2)^2 + (2-0)^2]^.5 + [(2-2)^2 + (0-2)^2]^.5

所有网格都保持像素值,所以我需要得到每个像素值的索引来关联距离。但是我的Alist数组保持[x,y]坐标,因此很容易。我想我现在有两个问题: 我没有正确得到这些权利 2.我没有正确地循环遍历aList中的坐标

2 个答案:

答案 0 :(得分:3)

在广播的帮助下,我得到了这个,基于你上一个例子的数据:

import numpy as np

grid = np.zeros((3, 3))
aList = np.array([[2, 0], [2, 2]])

important_rows, important_cols = aList.T
rows, cols  = np.indices(grid.shape)

dist = np.sqrt((important_rows - rows.ravel()[:, None])**2 +
               (important_cols - cols.ravel()[:, None])**2).sum(axis=-1)
dist = dist.reshape(grid.shape)

>>> dist
array([[ 4.82842712,  4.47213595,  4.82842712],
       [ 3.23606798,  2.82842712,  3.23606798],
       [ 2.        ,  2.        ,  2.        ]])

通过执行以下操作可以提高内存效率:

important_rows, important_cols = aList.T
rows, cols = np.meshgrid(np.arange(grid.shape[0]),
                         np.arange(grid.shape[1]),
                         sparse=True, indexing='ij')
dist2 = np.sqrt((rows[..., None] - important_rows)**2 +
                (cols[..., None] - important_cols)**2).sum(axis=-1)

答案 1 :(得分:1)

我的方法:

import numpy as np

n = 3

aList = np.zeros([n,n])
distance = np.zeros([n,n])

I,J = np.indices([n,n])

aList[2,2] = 1; aList[0,2] = 1   #Importan pixels
important = np.where(aList == 1) #Where the important pixels are

for i,j in zip(I[important],J[important]):   #This part could be improved...
    distance += np.sqrt((i-I)**2+(j-J)**2)

print distance

最后'for'可以改进,但如果你只有几个重要像素,性能会很好......


检查:

import matplotlib.pyplot as plt

n = 500

...

aList[249+100,349] = 1; aList[249-100,349] = 1 ;aList[249,50] = 1

...

plt.plot(I[important],J[important],'rx',markersize=20)
plt.imshow(distance.T,origin='lower',
           cmap=plt.cm.gray)
plt.show()

结果很舒服:

enter image description here