首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python numpy列表操作

python numpy列表操作
EN

Stack Overflow用户
提问于 2019-03-04 20:09:06
回答 3查看 96关注 0票数 1

我有下面的numpy数组:

代码语言:javascript
运行
复制
import numpy as np
a = np.array([2,15,66,180])

现在,我希望连续元素(diff) (除以25 )之间的差值总是小于或等于1 (diff/25 < 0)。

代码语言:javascript
运行
复制
out = some_function(a,25)
out

2,15,40,65,66,91,116,146,180

有什么智能的节能型方法可以做到吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-04 20:39:35

Numpy arange函数在那里可能有用,我会这样做:

代码语言:javascript
运行
复制
import numpy as np

a = np.array([2,15,66,180])
out = np.array([])
for i in range(len(a)-1):
    out = np.hstack((out,np.arange(a[i],a[i+1],25)))
out = np.hstack((out,a[-1:]))
print(out)

产出:

代码语言:javascript
运行
复制
[   2.   15.   40.   65.   66.   91.  116.  141.  166.  180.]

此解决方案假定为is平面数组。

编辑:在我注意到我的解决方案生成np.array of dtype float64之后,即输入的不同--取决于您的用法--它可能是一个问题,也可能不是一个问题。对于出现问题的情况,我将代码修改为以下形式:

代码语言:javascript
运行
复制
import numpy as np
a = np.array([2,15,66,180])
print(a.dtype) #int64
out = np.hstack([np.arange(a[i],a[i+1],25) for i in range(len(a)-1)]+[a[-1:]])
print(out) #[  2  15  40  65  66  91 116 141 166 180]
print(out.dtype) #int64

代码也更短,但我保留了原始代码,因为它可能更容易理解。

票数 1
EN

Stack Overflow用户

发布于 2019-03-04 20:53:09

我比较过“GGandalf”和“Daweo”的方法。直觉地说,我会期望arange方法更有表现力。但情况正好相反。甘道夫的解决方案要快5倍。

不确定它对您的用例是否重要,但我发现指出它很有趣。

代码语言:javascript
运行
复制
import timeit

setup_loop = """
import numpy as np
a = np.array([2,15,66,180])
def loop(a, step):
    b = []
    i = 0
    x = a[i]
    while i < a.size - 1:
        if x >= a[i+1]:
            i += 1
            x = a[i]
        b.append(x)
        x += step

    return b
"""

setup_array = """
import numpy as np
a = np.array([2,15,66,180])
def array(a, step):
    out = np.array([])
    for i in range(len(a) - 1):
        out = np.hstack((out, np.arange(a[i], a[i + 1], step)))
    out = np.hstack((out, a[-1:]))
    return out
"""
print(timeit.repeat("loop(a, 25)", setup_loop, number=100000, repeat=3))
print(timeit.repeat("array(a, 25)", setup_array, number=100000, repeat=3))

>>>[0.687177968943061, 0.6732553936845722, 0.6689018746795448]
>>>[3.5879034464852912, 3.6017167518256006, 3.5779435401398842]
票数 1
EN

Stack Overflow用户

发布于 2019-03-04 20:32:56

没有很好的数组数学,但它是通过增加计数器来工作的。我希望这就是你的意思,因为在你的问题中,你说diff/25 < 0应该是diff/25 <= 1

代码语言:javascript
运行
复制
import numpy as np
a = np.array([2,15,66,180])

def some_function(a, step):
    b = []
    i = 0
    x = a[i]
    while i < a.size - 1:
        if x >= a[i+1]:
            i += 1
            x = a[i]
        b.append(x)
        x += step
    return b

print(some_function(a, 25))

>>> [2, 15, 40, 65, 66, 91, 116, 141, 166, 180]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54990791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档