给定一个数组:
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]]])
如何将它们整齐地堆叠在一起以形成新的2D阵列?这就是我想要的:
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)
,这可能会减慢速度。
样品运行-
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很陌生。请问有人可以帮助我了解如何对用作索引的某些数组进行索引。我有以下六个2D阵列- 我想将这些数组用作索引,并将值10放入新的空矩阵的相应索引中。输出应如下所示: 到目前为止,我已经尝试过 但这给了我错误的输出。任何帮助请。 问题答案: 工作原理: 如果您在工作分配中使用 两个 numpy数组建立索引, 然后认为NumPy的作为过的各元件同时移动和中的每
问题内容: 我有一个奇怪的情况。 我有一个2D Numpy数组,x: 我有2个索引器-一个索引为行,一个索引为列。为了索引X,我必须执行以下操作: 不仅仅是: (失败:错误,无法通过(2,)广播(20,)) 我希望能够使用广播在一行中建立索引,因为这样可以使代码保持干净和可读性…而且,我对幕后的python并不太了解,但是据我了解它,它在一行中应该更快(我将使用相当大的数组)。 测试用例: 问题答
问题内容: 我要寻找一个量化的方式来索引的索引。 例如: 我想建立一个新的数组,以便该数组中的每一行(i)都是array的row(i),并由数组inds(i)的行索引。我想要的输出是: 我可以通过循环来实现: 但我正在寻找一种纯矢量化的解决方案。 问题答案: 使用索引数组对另一个数组进行索引时,每个索引数组的形状应与 输出 数组的形状匹配。您希望列索引匹配,并且您希望行索引匹配输出的行,例如: 由
问题内容: 假设我有一个带有任意值的矩阵A: 矩阵B包含A中元素的索引: 我该如何选择值一个指向由乙,即: 问题答案: 你可以使用 一个人也可以使用 样品运行
问题内容: 我有一个像这样的数组: 我试图得到这样的数组: 每行(具有固定的任意宽度)都移动一个。A的数组是10k记录长,我试图在Numpy中找到一种有效的方法。目前,我正在使用vstack和for循环,这很慢。有没有更快的方法? 编辑: 问题答案: 实际上,有一种更有效的方法来执行此操作…使用etc的缺点是,您正在复制数组。 顺便说一句,这实际上与@Paul的答案相同,但我将其发布只是为了更详细
问题内容: 我有一个看起来像这样的数组。这是一个二维数组。 我想使用此信息来创建一个新的三维数组,如下所示。 请对此有任何帮助。我陷入困境,需要弄清楚如何使用此原始数组创建新数组。因此,基本上,我将每台计算机上的所有作业分组在一起,而这些作业的密钥取决于它们在原始阵列中的状态。因此,如果原始阵列上有一个键为2的作业,而该机上没有其他作业具有更高的键,则它将变成该作业的键0,并使用该机器名创建一个新