3

我很难进行矢量化,我似乎还不能以这种方式思考数学。我现在有这个:

#!/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] 坐标,所以这很容易。我想我现在有两个问题:1.我没有正确获取索引 2.我没有正确循环 aList 中的坐标

4

2 回答 2

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)
于 2013-07-03T18:41:35.727 回答
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()

结果很舒服:

在此处输入图像描述

于 2013-07-03T18:20:35.823 回答