【问题标题】:slicing periodically for a numpy array定期切片 numpy 数组
【发布时间】:2020-11-21 14:18:29
【问题描述】:

我有一个 numpy 数组 a = np.arange(100),包括 100 个数字。 我想知道有没有办法定期切片而不是使用条件语句。

例如,如果我想切片第一个四个数字 + 第五个四个数字 + 第 9 个四个数字等等,最后将所有这些都放在一个数组中。

有什么建议吗?

谢谢

【问题讨论】:

  • 看看高级索引,这可能会有所帮助
  • 实际上,不清楚您要的是什么。如果您提供预期输出的示例,我们一定可以提供帮助
  • 当然,假设我有一个数组 [1 2 3 ... 99 100],我想取出这些定期出现的数字 (1 2 3 4 17 18 19 20 33 34 35 36 ...)。数字遵循第一个四数+第五个四数+第九个四数等模式。

标签: python python-3.x numpy numpy-slicing


【解决方案1】:

代码:

import numpy as np

a = np.arange(100)
grp = 4
grp_no = [1,5,9]
lst = np.array([a[range(n*grp-4, n*grp)] for n in grp_no])
print(lst)
print(lst.flatten()) #if required

输出:

[[ 0  1  2  3]
 [16 17 18 19]
 [32 33 34 35]]
[ 0  1  2  3 16 17 18 19 32 33 34 35]

【讨论】:

  • 感谢您的回复。我正在寻找更全面的方法。我的真实数据集非常大,我想继续切片到数组中的最后一个数字。
  • 一个班轮和真正的pythonic解决方案。你能详细说明一下你所说的全面是什么意思吗?谢谢
【解决方案2】:

您可以使用np.resize 将数组转换为二维,然后根据需要对行进行切片。如果a 不是 4 的精确倍数,请注意存在极端情况。

import numpy as np

wt = 4
a = np.arange(100)
ht = int(a.size/wt)
a.resize(ht, wt)
n = a[0::4,].flatten()
print(n)

输出:

[ 0  1  2  3 16 17 18 19 32 33 34 35 48 49 50 51 64 65 66 67 80 81 82 83
 96 97 98 99]

【讨论】:

  • 感谢您的解决方案,我认为这是最好的方法,因为我找不到任何其他方法。
【解决方案3】:

您想要一个跨步索引 - 我不知道可以完全矢量化的 numpy 工具,但它可能存在。

此解决方案从 a 中选择索引 idx_arr。唯一未矢量化(慢)的组件是跨步组的循环;其他一切都应该很快。特别注意预填充:

nmax = 10000
m = 4
a = np.random.rand(nmax)
_sub_arr = np.arange(m)
idx_arr = np.concatenate([_sub_arr + 4*m for m in range(0, int(nmax/m), 4)])
sol = a[idx_arr]
print(sol)

【讨论】:

    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 2020-12-11
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2015-01-29
    相关资源
    最近更新 更多