矢量化中的数组索引
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)
有没有办法在向量化的 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)