np.transpose() 和 np.reshape() 组合在纯 numpy 和 numba 中给出不同的结果
np.transpose() and np.reshape() combination gives different results in pure numpy and in numba
以下代码产生不同的输出:
import numpy as np
from numba import njit
@njit
def resh_numba(a):
res = a.transpose(1, 0, 2)
res = res.copy().reshape(2, 6)
return res
x = np.arange(12).reshape(2, 2, 3)
print("numpy")
x_numpy = x.transpose(1, 0, 2).reshape(2, 6)
print(x_numpy)
print("numba:")
x_numba = resh_numba(x)
print(x_numba)
输出:
numpy
[[ 0 1 2 6 7 8]
[ 3 4 5 9 10 11]]
numba:
[[ 0 4 8 2 6 10]
[ 1 5 9 3 7 11]]
这是什么原因?我怀疑某些 order='C'
与 order='F'
发生在某处,但我希望 numpy 和 numba 在任何地方都默认使用 order='C'
。
这是由于(至少)np.ndarray.copy 实现导致的错误,我在这里打开了一个问题:https://github.com/numba/numba/issues/3557
以下代码产生不同的输出:
import numpy as np
from numba import njit
@njit
def resh_numba(a):
res = a.transpose(1, 0, 2)
res = res.copy().reshape(2, 6)
return res
x = np.arange(12).reshape(2, 2, 3)
print("numpy")
x_numpy = x.transpose(1, 0, 2).reshape(2, 6)
print(x_numpy)
print("numba:")
x_numba = resh_numba(x)
print(x_numba)
输出:
numpy
[[ 0 1 2 6 7 8]
[ 3 4 5 9 10 11]]
numba:
[[ 0 4 8 2 6 10]
[ 1 5 9 3 7 11]]
这是什么原因?我怀疑某些 order='C'
与 order='F'
发生在某处,但我希望 numpy 和 numba 在任何地方都默认使用 order='C'
。
这是由于(至少)np.ndarray.copy 实现导致的错误,我在这里打开了一个问题:https://github.com/numba/numba/issues/3557