如何使用Numpy高效地创建条件列数组?

2024-05-03 03:38:05 发布

您现在位置:Python中文网/ 问答频道 /正文

目标是通过满足(x=>y) and (y=>z)的条件来创建数组

一种简单的方法是使用嵌套的for loop,如下所示

tot_length=200
steps=0.1
start_val=0.0
list_no =np.arange(start_val, tot_length, steps)

a=np.zeros(shape=(1,3))
for x in list_no:
    for y in list_no:
        for z in list_no:
            if (x>=y) & (y>=z):
                a=np.append(a, [[x, y, z]], axis=0)

虽然没有引发内存需求问题,但执行时间明显较慢

可以考虑的其他方法是使用下面的代码code。然而,只有当tot_length小于100时,该提案才能完美地发挥作用。除此之外,还出现了内存问题here

tot_length=200
steps=0.1
start_val=0.0
list_no =np.arange(start_val, tot_length, steps)
arr = np.meshgrid ( *[list_no for _ in range ( 3 )] )
a = np.array(list ( map ( np.ravel, arr ) )).transpose()
num_rows, num_cols = a.shape

a_list = np.arange ( num_cols ).reshape ( (-1, 3) )
for x in range ( len ( a_list ) ):
    a=a[(a[:, a_list [x, 0]] >= a[:, a_list [x, 1]]) & (a[:, a_list [x, 1]] >= a[:, a_list [x, 2]])]

感谢任何能够平衡总体执行时间和内存问题的建议。我也欢迎任何关于使用熊猫的建议,如果这能让事情顺利进行的话

要确定建议的输出是否产生了预期的输出,请使用以下参数

tot_length=3
steps=1
start_val=1

应该产生产出

1   1   1
2   1   1
2   2   1
2   2   2

Tags: 方法内存noinfornpvalsteps
2条回答

这样行吗

tot_length=200
steps=0.1
list_no = np.arange(0.0, tot_length, steps)
x, y, z = np.meshgrid(*[list_no for _ in range(3)], sparse=True)
a = ((x>=y) & (y>=z)).nonzero()

这将仍然使用8GB的内存作为布尔值的中间数组,但是避免了对np.append的重复调用,这会很慢

tot_length = 200
steps = 0.1
list_no = np.arange(0.0, tot_length, steps)

a = list()
for x in list_no:
    for y in list_no:
        if y > x:
            break

        for z in list_no:
            if z > y:
                break

            a.append([x, y, z])

a = np.array(a)
# if needed, a.transpose()

相关问题 更多 >