【发布时间】:2014-01-22 18:00:27
【问题描述】:
为了很好地处理类别变量,matlab 的 dummyvar 函数最pythonic的等价物是什么?
这是一个说明我的问题的示例,它使用 NxM 矩阵表示将 N 个数据点划分为
>> partitions
array([[1, 1, 2, 2, 1, 2, 2, 2, 1, 1],
[1, 2, 2, 1, 2, 1, 2, 2, 2, 1],
[1, 1, 1, 2, 2, 2, 1, 3, 3, 2]])
任务是高效统计任意两个数据点被归为同一类别的次数,并将结果存储在一个 NxN 矩阵中。在 matlab 中,这可以通过 dummyvar 的单行来实现,它为每个分区的每个类别创建一个列变量。
>> dummyvar(partitions)*dummyvar(partitions)'
ans =
3 2 1 1 1 1 1 0 1 2
2 3 2 0 2 0 2 1 2 1
1 2 3 1 1 1 3 2 1 0
1 0 1 3 1 3 1 1 0 2
1 2 1 1 3 1 1 1 2 2
1 0 1 3 1 3 1 1 0 2
1 2 3 1 1 1 3 2 1 0
0 1 2 1 1 1 2 3 2 0
1 2 1 0 2 0 1 2 3 1
2 1 0 2 2 2 0 0 1 3
我能想到的解决此任务的最有效方法是编写一个 O(n*m) 循环来模拟 dummyvar 的行为。 (请注意,下面的代码更喜欢partition.shape[0] partition.shape[1],这通常是正确的,但假设是不安全的)。
dv=np.zeros((0,10))
for row in partitions:
for val in xrange(1,np.max(row)+1):
dv=np.vstack((dv,row==val))
np.dot(dv.T,dv)
当然,因为循环中的 vstack 效率非常低,这可以通过找到所需的大小并创建数组来改进,但我真的在寻找一个像在 matlab 中一样的单行器。
编辑:有关我正在做什么的更多信息,只是为了添加上下文。我正在用python(不存在python实现)编写用于分析大脑网络的库的库函数。现有的工作 matlab 源是可用的。由于特定领域的限制,输入的最大大小大约是几千个节点的网络。但是,基本上我编写的所有函数都必须很好地扩展到大型输入。
【问题讨论】: