什么是行切片与什么是列切片?

时间:2017-02-02 09:10:20

标签: python machine-learning scipy scikit-learn sparse-matrix

是的,我已经阅读了thisthis answer,但我仍然无法理解它......这是一个基本问题。

在:

M[:, index]
M[index, :]

哪一个行切片,哪一个列切片

对于我的问题,如果我想为{}

这样的列做advanced indexing

M[:, indexes]  # indexes is an array like [0, 4, 9]

哪种稀疏矩阵类型最适合M[:, indexes]CSRCSC

3 个答案:

答案 0 :(得分:5)

实际上,行/列切片实际上都不是:这些是行/列索引的示例。

  • M[index, :]是行索引
  • M[:, index]是列索引
  • M[start:stop, :]是行切片
  • M[:, start:stop]是列切片

CSC在检索整列方面更有效:特定列的非零值和匹配的行索引在内部存储为内存中的连续数组。

对于CSR和整行的检索,双重是正确的。

答案 1 :(得分:3)

虽然csr的行选择比列选择更快,但差异并不大:

In [288]: Mbig=sparse.rand(1000,1000,.1, 'csr')
In [289]: Mbig[:1000:50,:]
Out[289]: 
<20x1000 sparse matrix of type '<class 'numpy.float64'>'
    with 2066 stored elements in Compressed Sparse Row format>
In [290]: timeit Mbig[:1000:50,:]
1000 loops, best of 3: 1.53 ms per loop
In [291]: timeit Mbig[:,:1000:50]
100 loops, best of 3: 2.04 ms per loop

In [292]: Mbig=sparse.rand(1000,1000,.1, 'csc')
In [293]: timeit Mbig[:1000:50,:]
100 loops, best of 3: 2.16 ms per loop
In [294]: timeit Mbig[:,:1000:50]
1000 loops, best of 3: 1.65 ms per loop

切换格式

是不值得的
In [295]: timeit Mbig.tocsr()[:1000:50,:]
...
100 loops, best of 3: 2.46 ms per loop

将此与密集版本的相同切片对比:

In [297]: A=Mbig.A
In [298]: timeit A[:,:1000:50]
...
1000000 loops, best of 3: 557 ns per loop
In [301]: timeit A[:,:1000:50].copy()
...
10000 loops, best of 3: 52.5 µs per loop

为了使比较复杂化,使用数组(numpy advanced)进行索引实际上比使用'slice'更快:

In [308]: idx=np.r_[0:1000:50]    # expand slice into array
In [309]: timeit Mbig[idx,:]
1000 loops, best of 3: 1.49 ms per loop
In [310]: timeit Mbig[:,idx]
1000 loops, best of 3: 513 µs per loop

此处csc的列索引具有更快的速度提升。

单行或列,csrcscgetrow/col种方法:

In [314]: timeit Mbig.getrow(500)
1000 loops, best of 3: 434 µs per loop
In [315]: timeit Mbig.getcol(500)        # 1 column from csc is fastest
10000 loops, best of 3: 78.7 µs per loop
In [316]: timeit Mbig[500,:]
1000 loops, best of 3: 505 µs per loop
In [317]: timeit Mbig[:,500]
1000 loops, best of 3: 264 µs per loop

https://stackoverflow.com/a/39500986/901925中,我重新创建了extractor用于获取行或列的sparse代码。它构造了1s和0s的新稀疏“向量”,并使用矩阵乘法来“选择”行或列。

答案 2 :(得分:2)

可以让命令每隔一段时间混淆,我的诀窍就是只画一个矩阵并记住索引顺序从上到下依次从左到右计算:https://en.wikipedia.org/wiki/Index_notation

down, left

因此,由于:表示所有,您知道[:, i]表示所有行,[i, :]表示所有行。

到你问题的第二部分:你想要M[:, indices],所以诀窍在于名称:如果你遍历你的列(你自己指定所有行),然后你想要压缩的稀疏列格式。它在您链接的文档中这样说:

  

CSC格式的优点

     
      
  • ...
  •   
  • 高效列切片
  •