矢量化中的数组索引

Array index inside vectorization

有没有办法在向量化的 numpy 方程中利用数组索引?

具体来说,我有这个循环代码,它将二维数组的每个值设置为到某个任意中心点的距离。

img=np.ndarray((size[0],size[1]))
for x in range(size[0]):
    for y in range(size[1]):
        img[x,y]=math.sqrt((x-center[0])**2+(y-center[1])**2)

我如何对其进行矢量化?

Pandas 的一些帮助将使这项任务相对容易:

import itertools
import pandas as pd
import numpy as np

# get all of the xy pairs
xys = pd.DataFrame(list(itertools.product(range(size[0]), range(size[1]))))

# calculate distance
xys["distance"] = np.sqrt((xys[0] - center[0]) ** 2 + (xys[1] - center[1]) ** 2)

# transform to a 2d array
img = xys.set_index([0, 1])["distance"].unstack()

# if you want just the Numpy array, not a Pandas DataFrame
img.values

是的,有。

import numpy as np

size = (6, 4)
center = (3, 2)
img_xy = np.array([[(x, y) for x in range(size[0])] for y in range(size[1])])

img = np.sum((img_xy - center) ** 2, axis=2) ** 0.5
print('\nPlan1:\n', img)

img = np.linalg.norm(img_xy - center, axis=2)
print('\nPlan2:\n', img)

你会得到这个:

Plan1:
 [[3.60555128 2.82842712 2.23606798 2.         2.23606798 2.82842712]
 [3.16227766 2.23606798 1.41421356 1.         1.41421356 2.23606798]
 [3.         2.         1.         0.         1.         2.        ]
 [3.16227766 2.23606798 1.41421356 1.         1.41421356 2.23606798]]

Plan2:
 [[3.60555128 2.82842712 2.23606798 2.         2.23606798 2.82842712]
 [3.16227766 2.23606798 1.41421356 1.         1.41421356 2.23606798]
 [3.         2.         1.         0.         1.         2.        ]
 [3.16227766 2.23606798 1.41421356 1.         1.41421356 2.23606798]]

有什么问题可以问我

您可以使用广播轻松解决此问题:

import numpy as np

size = (64, 64)
center = (32, 32)

x = np.arange(size[0])
y = np.arange(size[1])

img = np.sqrt((x - center[0]) ** 2 + (y[:, None] - center[1]) ** 2)