繁体   English   中英

在不更改尺寸的情况下更改多维NumPy数组的形状

[英]Change shape of multi-dimensional NumPy array without changing dimensions

我目前正在猴子修补Scikit-Learn函数,其中的一行需要2维的NumPy数组。 但是,我正在使用的数据是具有3维的NumPy数组,这会引发错误“无法解包的值太多”。

我正在调用fit对数据进行聚类的K-Means函数。 我的问题归结为以下代码,假设X是我传入的ndarray

n_samples, n_features = X.shape

X是一个具有3维的数组,如下所示:

X = np.array([[[1, 2, 3],
               [4, 5, 6]],

              [[7, 8, 9],
               [10, 11, 12]],

              [[13, 14, 15],
               [16, 17, 18]]])

数据表示一组具有6个维度的数据点的时间序列。 例如,第一个元素[[1, 2, 3], [4, 5, 6]]将代表一个时间序列,其中包含来自2个时间段的样本,每个样本具有3个维度。

我已经用猴子修补了k_means_代码,使我可以对ndarrayndarray进行聚类。 我的目标是在2D阵列上执行k均值。

是否可以将3D ndarray的形状设置为2个元素? 例如,我尝试将3D数组转换为2D对象数组,但最终将其转换回3D数组。

np.array([[x.astype(object) for x in c] for c in combined])

同样,以下代码也将转换回3D数组。

np.array([[np.array(x) for x in c] for c in combined])

列表[[x.astype(object) for x in c] for c in combined]看起来像它创建了正确的数组,但是由于它是list类型的,因此在该函数中不再起作用。

我正在寻找一种将3D NumPy数组“转换”为2维的方法。 任何帮助将不胜感激!

注意:我不是在寻找一种改变数组形状的方法。 我需要保留所有尺寸,但更改形状以忽略其中一个尺寸。

要创建一个数组数组,我们必须玩一些技巧,因为np.array尽力制作一个尽可能高维的数组。 如果子数组的大小不同可以,但是如果它们都相同,我们就必须抗衡。

这是一种方法:

从3D数组开始:

In [812]: arr = np.arange(24).reshape(2,3,4)

以及大小合适(但已展平)的空对象数组

In [813]: A = np.empty((6,),object)

复制值(再次展平),并调整为目标形状

In [814]: A[:]=list(arr.reshape(-1,4))
In [815]: A=A.reshape(2,3)
In [816]: A
Out[816]: 
array([[array([0, 1, 2, 3]), array([4, 5, 6, 7]), array([ 8,  9, 10, 11])],
       [array([12, 13, 14, 15]), array([16, 17, 18, 19]),
        array([20, 21, 22, 23])]], dtype=object)

因此,现在我们有了一个(2,3)数组,可以将其形状拆开。

我尝试从np.empty((2,3),object) ,但是无法获得A[:,:]=...分配工作。 为了使此对象重塑工作,我们必须将arr拆分为数组列表。 对象数组就像一个列表一样,是一个指针数组。

但是scikit函数会接受这样的数组吗? (经过形状障碍后)。 我怀疑对象重塑是一种短视解决方案。


In [824]: [[x.astype(object) for x in c] for c in arr]
Out[824]: 
[[array([0, 1, 2, 3], dtype=object),
  array([4, 5, 6, 7], dtype=object),
  array([8, 9, 10, 11], dtype=object)],
 [array([12, 13, 14, 15], dtype=object),
  array([16, 17, 18, 19], dtype=object),
  array([20, 21, 22, 23], dtype=object)]]
In [825]: _[0][0].shape
Out[825]: (4,)

这将创建一个嵌套的列表列表,内部元素是(4,)对象数组。 将其包装在np.array并使用dtype对象重新创建3d数组。


重塑,由于某种未知的原因,您不想保留数字dtype

In [828]: arr.reshape(2,-1)
Out[828]: 
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]])
In [829]: arr.reshape(-1,4)
Out[829]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19],
       [20, 21, 22, 23]])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM