我的渲染时间非常困难,我似乎无法以这种方式思考数学。我现在有这个:
#!/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中的坐标
答案 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()
结果很舒服: