列表到 ndarray 的列表
Posted
技术标签:
【中文标题】列表到 ndarray 的列表【英文标题】:List of List to ndarray 【发布时间】:2013-07-01 04:41:10 【问题描述】:我正在尝试在 scipy 中使用 kmeans 聚类,这正是这里存在的:
http://docs.scipy.org/doc/scipy/reference/generated/scipy.cluster.vq.kmeans.html#scipy.cluster.vq.kmeans
我想做的是转换一个列表,如下所示:
data without_x[
[0, 0, 0, 0, 0, 0, 0, 20.0, 1.0, 48.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1224.0, 125.5, 3156.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 22.5, 56.0, 41.5, 85.5, 0, 0, 0, 0, 0, 0, 0, 0, 1495.0, 3496.5, 2715.0, 5566.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
]
为了与 Kmeans 方法一起使用它。当我尝试将列表列表转换为 ndarray 时,我得到一个空数组,从而使整个分析无效。 ndarray 的长度是可变的,它取决于收集的样本数量。但我可以通过 len(data_without_x)
这是返回空列表的代码的 sn-p。
import numpy as np
import "other functions"
data, data_without_x = data_preparation.generate_sampled_pdf()
nodes_stats, k, list_of_list= result_som.get_number_k()
data_array = np.array(data_without_x)
whitened = whiten(data_array)
centroids, distortion = kmeans(whitened, int(k), iter=100000)
这就是我在一个简单的日志文件中保存的输出:
___________________________
this is the data array[[ 0. 0. 0. ..., 0. 0. 0.]
[ 0. 0. 0. ..., 0. 0. 0.]
[ 0. 0. 0. ..., 0. 0. 0.]
...,
[ 0. 0. 0. ..., 0. 0. 0.]
[ 0. 0. 0. ..., 0. 0. 0.]
[ 0. 0. 0. ..., 0. 0. 0.]]
___________________________
This is the whitened array[[ nan nan nan ..., nan nan nan]
[ nan nan nan ..., nan nan nan]
[ nan nan nan ..., nan nan nan]
...,
[ nan nan nan ..., nan nan nan]
[ nan nan nan ..., nan nan nan]
[ nan nan nan ..., nan nan nan]]
___________________________
有人知道当我尝试将列表列表转换为 numpy.array 时会发生什么吗?
感谢您的帮助
【问题讨论】:
尝试print(np.abs(data_array).sum())
看看数组是否真的为空。字符串表示并未显示所有内容。
上一行的输出不是零是2099918.5...这意味着它不是空的...那为什么我会得到这样的结果?
同样,打印 NumPy 数组并不能显示全部内容——非零元素在 ...
中。存在 NaN 是因为白化无法处理全零的行和列。你应该删除那些。 (这也会使 k-means 更快。)
【参考方案1】:
这正是在 python 中如何将列表列表转换为 ndarray 的方法。您确定您的data_without_x
填写正确吗?在我的机器上:
data = [[1,2,3,4],[5,6,7,8]]
data_arr = np.array(data)
data_arr
array([[1,2,3,4],
[5,6,7,8]])
我认为你期望的行为是什么
查看您的输入,您有很多零...请记住,打印输出并未显示所有这些。您可能只是从输入中看到所有“零”。检查特定的非零元素以确保
【讨论】:
【参考方案2】:vq.whiten
和vq.kmeans
期望一个形状为(M, N)
的数组,其中每一行 是一个观察值。所以转置你的data_array
:
import numpy as np
import scipy.cluster.vq as vq
np.random.seed(2013)
data_without_x = [
[0, 0, 0, 0, 0, 0, 0, 20.0, 1.0, 48.0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1224.0, 125.5, 3156.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 22.5, 56.0, 41.5, 85.5, 0, 0, 0, 0, 0, 0, 0, 0, 1495.0,
3496.5, 2715.0, 5566.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
]
data_array = np.array(data_without_x).T
whitened = vq.whiten(data_array)
centroids, distortion = vq.kmeans(whitened, 5)
print(centroids)
产量
[[ 1.22649791e+00 2.69573144e+00]
[ 3.91943108e-03 5.57406434e-03]
[ 5.73668382e+00 4.83161524e+00]
[ 0.00000000e+00 1.29763133e+00]]
【讨论】:
为什么我必须做data_array的T?在我的配置中,每一行都已经是一个观察值,如果我对它进行 T,那么每一列都将是一个观察值,不是这样吗? 如果,如您所说,“每一行都是一个观察结果”,那么您只有两个观察结果。然后将两行聚类几乎没有意义。您似乎更有可能对平面点进行 36 个或更多观测,并试图找到k
集群。如果该解释是正确的,那么您必须将一个形状为 (36,2) 而不是 (2,36) 的数组传递给 vk.kmeans
。
好吧,所以基本上我表达自己可能不正确。关键是当我写“例如”时,它意味着我试图聚集在一起的观察是那种形式,但这并不意味着只有这两个是观察。观察数是可变的,它取决于其他参数,在特定情况下,有 100K 行要聚类。 36 是分析的维度数。因此,例如,如果我有 75 个观察值,我需要传递 [75,36] 矩阵而不是 [36,75]。这是你想说的吗?【参考方案3】:
使用 numpy 的 asarray 函数。 这很简单: 参考:https://docs.scipy.org/doc/numpy/reference/generated/numpy.asarray.html
【讨论】:
不要将链接发布为答案,而是添加一些文本来解释此答案如何帮助 OP 解决当前问题。谢谢以上是关于列表到 ndarray 的列表的主要内容,如果未能解决你的问题,请参考以下文章
Python中ndarray对象和list(列表)的相互转换
python中numpy.ndarray怎么删除指定下标的元素
是否有将 numpy.ndarray 转换为列表的有效方法?