gpt4 book ai didi

python - 使用 NumPy 从另一个数组及其索引创建一个二维数组

转载 作者:太空狗 更新时间:2023-10-30 00:53:33 25 4
gpt4 key购买 nike

给定一个数组:

arr = np.array([[1, 3, 7], [4, 9, 8]]); arr

array([[1, 3, 7],
[4, 9, 8]])

并给出它的索引:

np.indices(arr.shape)

array([[[0, 0, 0],
[1, 1, 1]],

[[0, 1, 2],
[0, 1, 2]]])

我怎样才能将它们整齐地堆叠在一起形成一个新的二维阵列?这就是我想要的:

array([[0, 0, 1],
[0, 1, 3],
[0, 2, 7],
[1, 0, 4],
[1, 1, 9],
[1, 2, 8]])

这是我目前的解决方案:

def foo(arr):
return np.hstack((np.indices(arr.shape).reshape(2, arr.size).T, arr.reshape(-1, 1)))

它有效,但是是否有更短/更优雅的方法来执行此操作?

最佳答案

使用 array-initialization 然后使用 broadcasted-assignment 在后续步骤中分配索引和数组值 -

def indices_merged_arr(arr):
m,n = arr.shape
I,J = np.ogrid[:m,:n]
out = np.empty((m,n,3), dtype=arr.dtype)
out[...,0] = I
out[...,1] = J
out[...,2] = arr
out.shape = (-1,3)
return out

请注意,我们正在避免使用 np.indices(arr.shape),这可能会减慢速度。

sample 运行-

In [10]: arr = np.array([[1, 3, 7], [4, 9, 8]])

In [11]: indices_merged_arr(arr)
Out[11]:
array([[0, 0, 1],
[0, 1, 3],
[0, 2, 7],
[1, 0, 4],
[1, 1, 9],
[1, 2, 8]])

性能

arr = np.random.randn(100000, 2)

%timeit df = pd.DataFrame(np.hstack((np.indices(arr.shape).reshape(2, arr.size).T,\
arr.reshape(-1, 1))), columns=['x', 'y', 'value'])
100 loops, best of 3: 4.97 ms per loop

%timeit pd.DataFrame(indices_merged_arr_divakar(arr), columns=['x', 'y', 'value'])
100 loops, best of 3: 3.82 ms per loop

%timeit pd.DataFrame(indices_merged_arr_eric(arr), columns=['x', 'y', 'value'], dtype=np.float32)
100 loops, best of 3: 5.59 ms per loop

注意:时间包括转换为 pandas 数据帧,这是此解决方案的最终用例。

关于python - 使用 NumPy 从另一个数组及其索引创建一个二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45857465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com