【问题标题】:create array using numpy for-loop使用 numpy for 循环创建数组
【发布时间】:2017-07-13 14:25:56
【问题描述】:

好的,所以我在 Python 中包装了一个 C 库并调用了相应的 DLL 然后我创建了一个 for 循环,打印出所有 60,000 个数据点,然后导致 Python 崩溃。

这是我的问题:

如何在 numpy 中创建一个 for 循环,这样它会更快并且不会导致 python 崩溃?

这是我包装的 C 库和我正在调用的 dll 的一个小示例:

import ctypes 
from ctypes import * 

class SParm(Structure):
pass

SParm._fields_ = [
        ('name', ctypes.c_char_p),
        ('time', ctypes.POINTER(ctypes.c_float)),  

dll.readSParm.argtypes = (POINTER(SFile), c_char_p, c_double, c_double,    c_double, POINTER(TTag), c_ushort,)   
dll.readSParm.restype = POINTER(SParm)

g = dll.readSParm(SF, ParmName, startTime, stopTime, Null, None, convertType)

这是我创建的 Python for 循环。

time = (g[0].time)
for i in (time):
print(i)

^ 这会打印出值,然后在完成之前使 python 崩溃

我正在尝试这样的事情:

time = (g[0].time)
for i in (time):
np.savetxt(sys.stdout, i)

但是上面的代码向我抛出了这个错误:

ncol = X.shape[1]
IndexError: tuple index out of range

【问题讨论】:

  • for 循环不应该使 python 崩溃,即使有很多数据点。我宁愿猜测您有某种内存访问问题,但是如果没有看到您的 C 代码就很难知道。您是否尝试过使用少量数据点(可能是 10 个)?当 python 在你原来的 for 循环中崩溃时,你得到的实际错误是什么?
  • 我没有数据,所以我不能只尝试 10 个数据点。 time = (g[0].time) 是指向数据存储位置的指针。我试图让 python 为我打印出所有的值,但这最终导致它崩溃。当 Python 崩溃时,我没有收到错误代码。弹出一个框并显示“Python 已停止工作,这是一个问题引起的,请关闭程序”@ThomasKuhn
  • @ThomasKühn 有没有办法在给我最后一个数据点后结束循环?
  • 好吧,如果你知道确切的长度,那么是的。
  • @ThomasKühn 是的,我知道确切的长度。我将如何结束循环?

标签: python arrays numpy for-loop


【解决方案1】:

这在第一次尝试时可能不起作用,但我会在进行过程中编辑问题。尝试以这种方式更改您的for-loop:

for i in range(N):
   print(i, g[0].time[i])

这里N 是您说您知道的数据点的确切数量。还打印i 的想法是,如果程序仍然崩溃,我们会知道它在什么时候崩溃。

【讨论】:

  • 成功了!它打印出所有数据点并且不会使 Python 崩溃。
  • 如果您满意,您可以接受答案,以便其他人知道您不需要任何进一步的帮助。显然你的 dll 有问题——它似乎没有正确处理列表长度。
猜你喜欢
  • 2018-11-13
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
相关资源
最近更新 更多