在使用Numpy进行实验时,我发现numpy.info
提供的连续值可能与numpy.ndarray.data.contiguous
不同(参见下面的代码和屏幕截图)。
import numpy as np
x = np.arange(9).reshape(3,3)[:,(0,1)]
np.info(x)
print(f'''
{x.data.contiguous = }
{x.flags.contiguous = }
{x.data.c_contiguous = }
{x.flags.c_contiguous = }
{x.data.f_contiguous = }
{x.flags.f_contiguous = }
''')
根据有关memoryview类的文档,如果数组是C连续的或Fortran连续的,则data.contiguous == True
。至于numpy.info
,我相信它显示了flags.contiguous
的值。可惜的是,在the manual中没有关于它的信息。它实际上意味着什么?是flags.c_contiguous
的同义词吗?
3条答案
按热度按时间e4eetjau1#
在
numpy.info
的源代码中,我们可以看到处理ndarray
的子例程:它返回
flags.contiguous
作为数组的连续性参数。这一个在flags description中没有指定。但是我们可以在flagsobject.c中找到它:所以现在很清楚,来自
numpy.info
的contiguous
参数实际上是flags.c_contiguous
,与ndarray.data.contiguous
没有任何共同之处。我想在C语言中编程时,很自然地只说contiguous
而不是c_contiguous
,这导致了术语上的轻微不一致。ogq8wdun2#
np.arange(9)
生成一个一维数组;reshape(3,3)
将其重塑为2d。它是原始arange
的view
。如果没有order参数,reshape
将使用默认的c-order
。[0,[0,1]]
是高级索引,制作副本。使用[0,:2]
索引将选择相同的值,但生成view
。info
步长为(8,24)。整形后x
的strides
应该是(24,8),最后一个维度步进8个字节,第一个维度步进3*8。但是高级索引会把事情颠倒过来--这是我们通常忽略(或不知道)的索引细节。第一个跨距较小的二维数组是
F-order
。我不会试图破译所有的数据/单位连续打印,但基本布局是显而易见的,我从形状和步伐。我认为步幅有优先权,所有的“连续”显示都是衍生的,可以说是对步幅的解释。
对于3d(或更高)阵列,
contiguous
替代品可能会崩溃。可以用(48,8,24)这样的步幅来创建数组,其中中间维度的步幅最快。既不是C也不是F。我可能会补充说,除非你正在做的事情,
我们通常不担心这种接触。一些功能(特别是编译的)需要一定的连续性。有些操作更快(或更慢),这取决于哪个维度是“最内部的”。但对于普通的
numpy
使用,我不太注意flags
。我使用numpy
很多年了,才意识到您的示例索引翻转了order
。您可以只显示
x.flags
。我不知道显示x.data
对你有什么用。编辑
x
,在我的会话中创建为int32
:我通常使用
__array_interface__
而不是np.info
,但信息是相似的:我通常更多地关注
strides
而不是标志,但这里是完整的显示:为什么
owndata
是False?显然,索引实际上创造了:然后返回转置。c_contiguous数组的转置是f_contiguous。
如果我创建相同的数组(按值),但使用切片,我会得到一个
view
,它在两种意义上都不连续:它是
base
值的不连续子集。base
是原始的np.arange(...)
,而不是reshaped
的结果。carvr3hs3#
若要修复此错误
只需对代码进行一些更改,如下所示:
不需要升级你的sklearn版本。只需添加
.values