In [423]: adf = pd.DataFrame(a)
In [424]: ix_list = np.arange(nrow,dtype=np.int32)
您的問題索引創建A F有序排列,如flags
和strides
看到。這是我期望在普通numpy陣列上做transpose
時看到的結果。
In [426]: adf.loc[ix_list].values.flags
Out[426]:
C_CONTIGUOUS : False
F_CONTIGUOUS : True
OWNDATA : False
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
In [427]: adf.loc[ix_list].values.strides
Out[427]: (4, 40)
但其他loc
索引產生一個C順序排列:
In [428]: adf.loc[:].values.flags
Out[428]:
C_CONTIGUOUS : True
F_CONTIGUOUS : False
....
In [429]: adf.loc[ix_list[::2]].values.flags
Out[429]:
C_CONTIGUOUS : True
F_CONTIGUOUS : False
...
In [430]: adf.loc[ix_list[:-2]].values.flags
Out[430]:
C_CONTIGUOUS : True
F_CONTIGUOUS : False
...
這看起來在pandas
loc
索引的錯誤。
我猜np.ascontiguousarray
是最便宜的方法來確保所有的情況下都是C排序的,因爲它有一個np.array(..., copy=False)
,這是一個條件copy
。已經是C
的數組將不會複製。
在快速測試中,增加一個copy
或np.ascontiguousarray
並不會減慢速度。
In [439]: timeit np.ascontiguousarray(adf.loc[ix_list].values).flags
514 µs ± 7.07 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [440]: timeit adf.loc[ix_list].values.copy().flags
509 µs ± 5.94 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [441]: timeit adf.loc[ix_list].values.flags
513 µs ± 18.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [442]: timeit adf.loc[:].values.flags
24.9 µs ± 11.1 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [443]: timeit np.ascontiguousarray(adf.loc[:].values).flags
30 µs ± 865 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [444]: timeit adf.loc[ix_list[:-1]].values.flags
559 µs ± 12.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [445]: timeit np.ascontiguousarray(adf.loc[ix_list[:-1]].values).flags
559 µs ± 1.41 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
的numpy的陣列上選擇行是大大高於使用loc
:
In [446]: timeit adf.loc[:].values[ix_list].flags
32.9 µs ± 1.33 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [447]: timeit adf.values[ix_list].flags
20.9 µs ± 1.09 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
這是什麼'loc'產生陣列的'shape'?它的「旗幟」? – hpaulj
你的意思是從a.loc [ix_list ,:]中ndarray的形狀?它與a的形狀相同,在這種情況下是(10,10)。 –