Numpy报”ValueError:input array is not contiguous “的原因以及解决办法

yizhihongxing

问题描述

在进行Numpy运算时,有时会出现如下错误提示:

ValueError: input array is not contiguous

这个错误是什么意思呢?出现了这个错误,我们该怎么办呢?

分析原因

值得注意的是,这个错误提示只有在使用高级Numpy操作时才会出现,比如在使用转置、重塑、切片等操作时,Numpy可能会要求数组是连续的。

什么情况下,数组不是连续的呢?

  • 轴上的步长不等:每个轴上的步长为一个固定大小,如果步长不一致,那么数组就会是不连续的。
  • 非常规切片:某些切片操作将获得非连续数组的视图,这些数组将无法使用一些高级操作,如转置、重塑等。

在大多数情况下,这个问题只是轻微的措辞,不会对程序的运行产生太大的影响。但是在某些情况下,如果数组不是连续的,会使算法的性能大幅降低。

解决办法

那么,如何解决这个问题呢?根据不同情况,不同的解决办法如下:

1.如果数组是非连续的,可以使用Numpy的copy()函数创建连续的数组:

import numpy as np
a = np.array([[1, 2], [3,4]])
print(a)
#输出
#[[1 2]
# [3 4]]

print(a.flags)  # 查看数组信息,发现数组不是连续的。

#输出

# C_CONTIGUOUS : False
# F_CONTIGUOUS : False
# OWNDATA : True
# WRITEABLE : True
# ALIGNED : True
# WRITEBACKIFCOPY : False
# UPDATEIFCOPY : False

b = np.copy(a)
print(b.flags)   # 现在 b 是连续数组。
#输出

# C_CONTIGUOUS : True
# F_CONTIGUOUS : True
# OWNDATA : True
# WRITEABLE : True
# ALIGNED : True
# WRITEBACKIFCOPY : False
# UPDATEIFCOPY : False

2.如果是一些特殊的切片操作导致的非连续数组,则可以使用Numpy的ascontiguousarray()函数将其转化为连续数组:

import numpy as np
a = np.arange(8).reshape(2,4)[::2, ::2]
print(a)
#输出
#[[0 2]]

b = np.ascontiguousarray(a)
print(b)
#输出
#[[0 2]]

这个例子中,我们使用了arange()函数创建了一个2×4的数组,然后使用切片操作将其转化为一个只有一行、两列的数组。由于切片操作是不连续的,所以使用转化函数ascontiguousarray()将其转化为一个连续的数组。

总结

本文详细介绍了Numpy中,出现“ValueError: input array is not contiguous”错误的原因及解决方法。针对不同情况,我们可以使用copy()函数或ascontiguousarray()函数将非连续数组转化为连续数组,以满足高级运算的需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Numpy报”ValueError:input array is not contiguous “的原因以及解决办法 - Python技术站

(0)
上一篇 2023年3月16日
下一篇 2023年3月16日

相关文章

合作推广
合作推广
分享本页
返回顶部