Python:Numpy Matrix拆分

时间:2016-07-11 08:37:48

标签: python numpy matrix

我有一个形状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 个答案:

答案 0 :(得分:5)

您可以传递分割的索引,在这种情况下,您只需使用np.arange()即可创建它们:

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

答案 1 :(得分:2)

我不知道如何使用np.hsplit和int作为第二个参数,但环顾四周时,我发现了一种使用数组作为参数的方法。

这样做的方法是:

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的末尾创建空数组;

Edit2:另一种创建temp_array的方法是

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

将所有内容放在一行:

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

Edit3:发现使用python3时遇到了问题(使用python2测试):int分区的结果可能是浮点数。使用//代替/进行除法,以确保结果为int

说明:我创建了一个数组('splitting_array'),其中我想要的子数组的每个倍数都严格地在0和原始数组的大小之间。
然后我使用'splitting_array'拆分原始数组。根据numpy.split的文档,它将沿着水平轴将original_array分割为'splitting_array'给出的索引。
因此,在我们的例子中,original_array将在每个索引之前被拆分为10的倍数。

答案 2 :(得分:0)

要进行多次拆分,我们可以传递一个索引列表,描述需要拆分的位置。例如

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])

拆分意味着它将按如下方式切片

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的工作方式相似。

希望有帮助