【问题标题】:How to create a array of consecutive numbers array in numpy?如何在numpy中创建一个连续数字数组?
【发布时间】:2021-10-26 04:35:53
【问题描述】:

我正在寻找如下生成一个数组:

array([[ 1,  2],
       [ 2,  3],
       [ 3,  4],
       [ 4,  5],
       [ 5,  6],
       [ 6,  7],
       [ 7,  8],
       [ 8,  9],
       [ 9, 10]])

这是我在 NumPy 中的生成方式:

import numpy as np
a = np.arange(1, 10)
b = np.arange(2, 11)
np.stack((a, b), axis=1)

NumPy 中是否有任何函数可以直接执行此操作?

【问题讨论】:

    标签: arrays numpy stack


    【解决方案1】:

    我不知道有什么内置的方法可以做这种安排,但这里有一些替代解决方案。

    • 使用半步长和np.floor:

      >>> np.floor(np.arange(1.5, 10.5, .5)).reshape(9, 2)
      
    • 使用np.repeat

      >>> np.repeat(np.arange(1, 11), 2)[1:-1].reshape(9, 2)
      
    • 使用np.lib.stride_tricks.as_strided(imo 最好的方法):

      >>> as_strided(np.arange(1, 11), shape=(9, 2), strides=(8, 8))
      

      由于您要实现的 2D->1D 映射是 i + j = k,因此步幅必须是 (1, 1)(以字节为单位)(8, 8)(以位为单位)。

    【讨论】:

      【解决方案2】:

      我能想到的最短答案,使用broadcasting黑魔法:

      # Solution 1:
      np.r_[:9][:,None]+[1,2]
      # Solution 2:
      np.r_['c',:9]+[1,2]
      

      或者也使用np.r_但这次不广播:

      # Solution 3:
      np.r_['1,2,0', :10, 1:11]
      

      每个解决方案都按预期产生:

      array([[ 1,  2],
             [ 2,  3],
             [ 3,  4],
             [ 4,  5],
             [ 5,  6],
             [ 6,  7],
             [ 7,  8],
             [ 8,  9],
             [ 9, 10]])
      

      【讨论】:

      • 现在,这令人印象深刻。简单但令人印象深刻。 +1
      • 我现在对我的回答感到难过!感谢您向我们展示np.r_
      猜你喜欢
      • 2020-12-31
      • 2023-03-22
      • 2017-03-17
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 2012-03-17
      • 2018-02-10
      相关资源
      最近更新 更多