Python:Numpy矩阵分割

4
我有一个形状为4 x 129的矩阵。我想进行水平分割,如下面的示例所示:
In [18]: x = np.arange(4*129)

In [19]: x = x.reshape(4, 129)

In [20]: x.shape
Out[20]: (4, 129)

In [21]: y = np.hsplit(x, 13)

ValueError: array split does not result in an equal division

我知道它无法平均分成13份。我不想在另一列上进行零填充并除以13。

我想将x矩阵分成13个小矩阵,每个12个分割应该是4 x 10的大小,最后一个应该是4 x 9的大小。

有没有办法这样做?

3个回答

5

您可以传递拆分的索引。在这种情况下,您可以使用np.arange()简单地创建它们:

>>> a = np.hsplit(x, np.arange(12, 129, 12))
>>> 
>>> a[0].shape
(4, 12)
>>> a[-1].shape
(4, 9)

2

我不知道如何使用np.hsplit和一个整数作为第二个参数来完成此操作,但在寻找解决方法时,我发现可以使用数组作为参数来完成此操作。

具体实现方式如下:

temp_array = [(i+1)*10 for i in range((129-1)//10)]
y = np.hsplit(x,temp_array)

或者在一行中:
y = np.hsplit(x,[(i+1)*10 for i in range((129-1)//10)])

编辑:在创建数组时添加-1,以防止在原始数组的大小是子数组大小的倍数时,在x的末尾创建空数组;

编辑2:创建temp_array的另一种方法是

temp_array = np.arange(10,129,10)

将所有内容放在一行中:

y = np.hsplit(x,np.arange(10,129,10))

编辑3:发现使用python3存在问题(之前是使用python2进行测试):整数除法的结果可能是浮点数。请使用//代替/进行除法运算,以确保结果为整数。

解释:我创建了一个数组('splitting_array'),其中包含严格介于0和原始数组大小之间的子数组大小的倍数。
然后,我使用'splitting_array'分割原始数组。根据numpy.split的文档,它将在由'splitting_array'给出的索引处沿水平轴拆分原始数组。
因此,在我们的情况下,原始数组将在每个10的倍数索引之前被拆分。


请检查您的答案。它显示“TypeError:'float'对象无法解释为整数”。 - Rangooski
修复了这个问题,原因是我在Python2.7中进行基本除法运算,如果两个元素均为整数,则返回整数;但在Python3中则返回浮点数。将其替换为int_division以解决问题。 - HolyDanna
太好了 HolyDanna :)。 - Rangooski

1

要进行多个分割,我们可以传递一个索引列表,表示需要进行分割的位置。例如:

arr = np.array([1,2,3,4,5,6,7,8,9,10])

# we want to split at Index 3,6,8, so we'll use split as

split_arr = np.split(arr, [3,6,8])

split 的意思是将字符串(string)划分成如下部分:

1. arr [0:3]  # Index - > 0,1,2
2. arr [3:6]  # Index -> 3,4,5,
3. arr [6:8]  # Index -> 6,7
4. arr [8:]   # Index -> 8...end

你也可以重新塑造单个的分割,如下:

split_arr.reshape(3,1)

在上面的例子中,假设我们只有129个元素(为简单起见不乘以4),则可以进行拆分。
new_arr = np.split(arr, [13,26,39,52,65,78,91,104,117] )

在一维数组上,splithsplit的工作方式相似。

希望能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接