如何在不规则形状的numpy数组中选择第一个和最后一个元素

ddhy6vgd  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(84)

我一直很难在网上找到这个问题的答案,所以我想我应该查询一下Stack Overflow。
我举个例子:

v = np.array([
    np.array([1, 1]),
    np.array([1, 2]),
    np.array([1, 3]),
    np.array([1, 4]),
    np.array([1, 5]),
    np.array([2, 1]),
    np.array([2, 2]),
    np.array([2, 3]),
    np.array([3, 1]),
    np.array([3, 2]),
    np.array([3, 3]),
    np.array([3, 4]),
    np.array([4, 1]),
    np.array([4, 2]),
    np.array([4, 3]),
    np.array([4, 4]),
    np.array([4, 5]),
    np.array([4, 6]),
])

k = np.split(v[:, 1], np.unique(v[:, 0], return_index=True)[1][1:])

# output below

[
    np.array([1,2,3,4,5]),
    np.array([1,2,3]),
    np.array([1,2,3,4]),
    np.array([1,2,3,4,5,6])
]

我的目标是选择输出列表中每个数组的第一个和最后一个元素。我想做的是:

k = np.array(k, dtype=object)
new_k = (([:, 0], [:, -1]))

但是,唉,这是不可能的。也许有一种方法可以重写创建k的行,使其只包含第一个和最后一个项?
请注意,我试图在没有列表解析、定义函数或循环的情况下完成这一任务--只使用“vanilla”numpy。如果这是不可行的,任何方向的下一个最有效的方式来完成这将是伟大的。

klsxnrf1

klsxnrf11#

np.unique操作选择第一次出现的值。对正常数组这样做意味着它选择每组的第一个,对反向数组这样做意味着它选择每组的最后一个。

import numpy as np

v = np.array([
    [1, 1],
    [1, 2],
    [1, 3],
    [1, 4],
    [1, 5],
    [2, 1],
    [2, 2],
    [2, 3],
    [3, 1],
    [3, 2],
    [3, 3],
    [3, 4],
    [4, 1],
    [4, 2],
    [4, 3],
    [4, 4],
    [4, 5],
    [4, 6],
])

first_values = v[np.unique(v[:, 0], return_index=True)[1], 1]
last_values = v[::-1][np.unique(v[::-1, 0], return_index=True)[1], 1]

k = np.vstack((first_values, last_values)).T

这给出了期望的结果,

array([[1, 5],
       [1, 3],
       [1, 4],
       [1, 6]])

相关问题