【发布时间】:2014-08-13 12:33:45
【问题描述】:
我有一组复杂的数据,我必须对其进行距离计算。数据集中的每条记录都包含许多不同的数据类型,因此记录数组或结构化数组似乎是要走的路。问题是当我必须进行距离计算时,scipy 空间距离函数采用数组,而记录的数组是 numpy voids。如何制作一个记录的 numpy 数组而不是 numpy voids?下面是我所说的一个非常简单的例子。
import numpy
import scipy.spatial.distance as scidist
input_data = [
('340.9', '7548.2', '1192.4', 'set001.txt'),
('546.7', '9039.9', '5546.1', 'set002.txt'),
('456.3', '2234.8', '2198.8', 'set003.txt'),
('332.1', '1144.2', '2344.5', 'set004.txt'),
]
record_array = numpy.array(input_data,
dtype=[('d1', 'float64'), ('d2', 'float64'), ('d3', 'float64'), ('file', '|S20')])
以下代码失败...
this_fails_and_makes_me_cry = record_array[['d1', 'd2', 'd3']]
scidist.pdist(this_fails_and_makes_me_cry)
我收到此错误....
Traceback (most recent call last):
File "/home/someguy/working_datasets/trial003/scrap.py", line 16, in <module>
scidist.pdist(record_array[['d1', 'd2', 'd3']])
File "/usr/lib/python2.7/dist-packages/scipy/spatial/distance.py", line 1093, in pdist
raise ValueError('A 2-dimensional array must be passed.');
ValueError: A 2-dimensional array must be passed.
发生错误是因为 this_fails_and_makes_me_cry 是一个 numpy.voids 数组。为了让它工作,我每次都必须像这样转换......
this_works = numpy.array(map(list, record_array[['d1', 'd2', 'd3']]))
scidist.pdist(this_works)
是否可以创建一个由 numpy 数组组成的记录数组?或者一个 numpy 记录/结构化数组是否仅限于 numpy voids?记录数组以与 scipy 的空间距离函数兼容的格式包含数据会很方便,这样我就不必每次都进行转换。这可能吗?
【问题讨论】:
-
我的理解是 Numpy 结构化数组只能包含离散类型的字段(加上固定长度的字符串),所以不,你不能存储数组。您可以将该转换转换为函数以使其更容易......并使用一些标准方法将数据转换为二维数组(如
array.view),see here -
无赖。我希望情况并非如此,因为由于大量的距离计算和我拥有的大型数据集,我必须这样做很多次。感谢您的链接。
标签: python numpy scipy euclidean-distance