当前位置: 首页 > 知识库问答 >
问题:

如何在NumPy中创建数字序列?

夏侯俊美
2023-03-14

灵感来源于如何在R?中创建数字序列的帖子

问题:

我想在NumPy中制作以下序列。

[1, 2, 3, 4, 5, 2, 3, 4, 5, 3, 4, 5, 4, 5, 5]

我尝试了以下方法

  • Non-generic and hard coding using np.r_
    np.r_[1:6, 2:6, 3:6, 4:6, 5:6]
    # array([1, 2, 3, 4, 5, 2, 3, 4, 5, 3, 4, 5, 4, 5, 5])
    
    n = 5
    a = np.r_[1:n+1]
    [i for idx in range(a.shape[0]) for i in a[idx:]]
    # [1, 2, 3, 4, 5, 2, 3, 4, 5, 3, 4, 5, 4, 5, 5]
    
    n = 5
    a = np.r_[1:n+1]
    arr = np.tile(a, (n, 1))
    print(arr)
    # [[1 2 3 4 5]
    #  [1 2 3 4 5]
    #  [1 2 3 4 5]
    #  [1 2 3 4 5]
    #  [1 2 3 4 5]]
    
    o = np.triu(arr).flatten()
    # array([1, 2, 3, 4, 5, 
    #        0, 2, 3, 4, 5, 
    #        0, 0, 3, 4, 5, # This is 1D array
    #        0, 0, 0, 4, 5, 
    #        0, 0, 0, 0, 5])
    
    out = o[o > 0]
    # array([1, 2, 3, 4, 5, 2, 3, 4, 5, 3, 4, 5, 4, 5, 5])
    

    上面的解决方案是通用的,但我想知道是否有更有效的方法在NumPy中实现。

共有2个答案

虞华翰
2023-03-14

一个非常简单的Python(没有Numpy)方法是:

n = 5
a = [r for start in range(1, n+1) for r in range(start, n+1)]

这对于较小的n(~150)来说会更快,但对于较大的n来说会比@tangolin的解决方案慢。它仍然比OP的“纯python”方式快。

更快的实施可以提前准备数据,避免每次都创建新范围:

source = np.arange(1, n+1)
d = np.concatenate([source[i: n+1] for i in range(0, n)])
师增
2023-03-14

我不确定这是否是一个好主意,但我试图运行它对你的python方法,它似乎更快。

np.concatenate([np.arange(i, n+1) for i in range(1, n+1)])

以下是完整的代码:

import numpy as np
from time import time

n = 5000

t = time()
c = np.concatenate([np.arange(i, n+1) for i in range(1, n+1)])
print(time() - t)
# 0.039876699447631836

t = time()
a = np.r_[1:n+1]
b = np.array([i for idx in range(a.shape[0]) for i in a[idx:]])
print(time() - t)
# 2.0875167846679688

print(all(b == c))
# True
 类似资料:
  • 我想通过使用或任何其他函数在R中创建以下序列。 基本上,。

  • 主要内容:numpy.empty(),numpy.zeros(),numpy.ones(),numpy.asarray(),numpy.frombuffer(),numpy.fromiter()在《 NumPy Ndarray对象》一节,介绍了创建 ndarray 数组的基本方法,除了使用 array() 方法外,NumPy 还提供了其他创建 ndarray 数组的方法。本节对这些常用方法做简单介绍。 numpy.empty() numpy.empty() 创建未初始化的数组,可以指定创建数组的

  • 问题内容: 我正在尝试在MySQL中创建序列(从整体上来说,我对SQL还是很新的)。我正在使用以下代码,但这会导致错误: ORDID指向我正在使用的表中的字段。如何正确创建序列? 编辑: 据称,MySQL不使用序列。我现在正在使用以下代码,但这也会引起错误。我该如何解决? 编辑: 我想我找到了解决方法。对于phpMyAdmin(我正在使用),您可以使用以下代码。 我不知道为什么它会喜欢这种方式,但

  • 问题内容: 我想创建一个numpy数组,其中每个元素必须是一个列表,因此以后我可以向每个元素追加新元素。 我已经看过谷歌,这里已经有堆栈溢出,但是似乎找不到地方。 主要问题是numpy假定您的列表必须成为数组,但这不是我要的。 问题答案: 如您所见,在给出类似以下内容时,尝试创建2d数组 您已应用了一些技巧来解决此默认行为。 一种是使子列表的长度可变。它不能从这些数组中生成2d数组,因此它求助于对

  • 这听起来很愚蠢,但我在StackOverflow或Google上都找不到答案。我需要做一件非常简单的事情——将一个每个集合中包含两个数字的数据提供程序传递给我的TestNG测试,但我没有成功。这是我的代码: 我的测试看起来是这样的 当我试图运行它时,我得到下一条错误消息: 数据提供程序公共java.lang.Object[]必须返回Object[][]或Iterator[],而不是类[Ljava.

  • 问题内容: 我有一个长度为m的n个向量的数组。例如,当 n = 3时 , m = 2 : 我想将每个向量的外积与自身相乘,然后将它们连接成形状为 (n,m,m) 的正方形矩阵的数组。所以对于以上我会得到 我可以像这样循环 是否有一个numpy表达式可以在没有Python循环的情况下执行此操作? 额外的问题:由于外部乘积是对称的,因此我不需要 mxm 乘法运算来计算它们。我可以从numpy获得这种对