在实现 Numba 时与嵌套的 Numpy 数组作斗争
Struggling with nested Numpy array when implementing Numba
我有一个 Numpy 数组,其中包含来自 56 个 x 射线(arr1,float32 数组)的信息,其中一列包含与 arr1 相关的 56 个数组 [95200,2](arr2,对象数组)。我的目标是遍历两个数组并创建一个新数组,其中包含 arr1 中 arr2 (arr_out) 中每一行的信息。
作为一种练习方式,我想实施 Numba 以加快速度,但这确实会引发 Numba 错误,我无法解决这些错误。
如果我理解正确的话,这主要是由 arr2 引起的,因为它是一个对象数组,但是我无法集中精力寻找解决方案。
有人可以推我一下吗?
我当前的代码;
@numba.jit
def fill():
arr_out = np.empty((0,6))
row, column = arr1.shape
for row in range(0,row):
print('Row number: {}'.format(row))
matrix = arr2[row]
matrix_rows = len(matrix)-1
for m_row in range(0, matrix_rows):
inp_arr = [np.hstack((arr1[row, 0:4],matrix[matrix_row]))]
arr_out = np.vstack((arr_out, inp_arr))
return arr_out
编辑:我忘了显示警告;
Compilation is falling back to object mode WITH looplifting enabled because Function "fillspec" failed type inference due to: Untyped global name 'arr2': Unsupported array dtype: object
File "<ipython-input-44-7e98fec24979>", line 7:
def fillspec():
<source elided>
print('Row number: {}'.format(row))
matrix = arr2[row]
还有其他的,但如果我理解正确的话,它们与这个初始警告有关。 (我不觉得警告转储会增加我的问题:))
(术语嵌套数组在这种情况下是正确的吗?)
编辑 2:如前所述,arr2 的定义很可能很重要;
为了将 arr1 定义为浮点数,我取出了 arr2;
arr2 = arr_orig[:,8]
arr1 = np.delete(arr_orig,8, axis=1)
arr1 = arr1.astype(np.float32)
这将 arr2 保留为对象数组,但是 arr2 中的嵌套数组 定义为浮点数。
感谢@hpaulj 提供的 awnser,我正在努力解决一个简单的问题。
我的解决方案是将每个循环结果列表放入一个列表中,在关闭循环后将列表转换为数组。最初花费很长时间的地方现在只需要不到 2 分钟(这确实让我有些怀疑;))。
感谢大家的帮助!
旁注;我在循环上放置了一个计时器,并注意到每个循环的时间都在增加。这与@hpaulj 的 awnser 相结合促使我重建。
我有一个 Numpy 数组,其中包含来自 56 个 x 射线(arr1,float32 数组)的信息,其中一列包含与 arr1 相关的 56 个数组 [95200,2](arr2,对象数组)。我的目标是遍历两个数组并创建一个新数组,其中包含 arr1 中 arr2 (arr_out) 中每一行的信息。
作为一种练习方式,我想实施 Numba 以加快速度,但这确实会引发 Numba 错误,我无法解决这些错误。
如果我理解正确的话,这主要是由 arr2 引起的,因为它是一个对象数组,但是我无法集中精力寻找解决方案。
有人可以推我一下吗?
我当前的代码;
@numba.jit
def fill():
arr_out = np.empty((0,6))
row, column = arr1.shape
for row in range(0,row):
print('Row number: {}'.format(row))
matrix = arr2[row]
matrix_rows = len(matrix)-1
for m_row in range(0, matrix_rows):
inp_arr = [np.hstack((arr1[row, 0:4],matrix[matrix_row]))]
arr_out = np.vstack((arr_out, inp_arr))
return arr_out
编辑:我忘了显示警告;
Compilation is falling back to object mode WITH looplifting enabled because Function "fillspec" failed type inference due to: Untyped global name 'arr2': Unsupported array dtype: object
File "<ipython-input-44-7e98fec24979>", line 7:
def fillspec():
<source elided>
print('Row number: {}'.format(row))
matrix = arr2[row]
还有其他的,但如果我理解正确的话,它们与这个初始警告有关。 (我不觉得警告转储会增加我的问题:))
(术语嵌套数组在这种情况下是正确的吗?)
编辑 2:如前所述,arr2 的定义很可能很重要; 为了将 arr1 定义为浮点数,我取出了 arr2;
arr2 = arr_orig[:,8]
arr1 = np.delete(arr_orig,8, axis=1)
arr1 = arr1.astype(np.float32)
这将 arr2 保留为对象数组,但是 arr2 中的嵌套数组 定义为浮点数。
感谢@hpaulj 提供的 awnser,我正在努力解决一个简单的问题。
我的解决方案是将每个循环结果列表放入一个列表中,在关闭循环后将列表转换为数组。最初花费很长时间的地方现在只需要不到 2 分钟(这确实让我有些怀疑;))。
感谢大家的帮助!
旁注;我在循环上放置了一个计时器,并注意到每个循环的时间都在增加。这与@hpaulj 的 awnser 相结合促使我重建。