pysal.lib.weights.w_clip

pysal.lib.weights.w_clip(w1, w2, outSP=True, silence_warnings=False)[源代码]

使用不同的w对象(w2)裁剪连续w对象(w1),以便只有w2具有非零值的单元格在w1中保留非零值。

对w1和w2进行检查,以确保它们符合适当的格式,如果不符合,则进行转换。

参数:
w1 : W

w,scipy.sparse.csr.csr_矩阵可能需要裁剪连续权重矩阵。裁剪矩阵wc最多具有与w1相同的元素。

w2 : W

w,scipy.sparse.csr.csr_matrix weights matrix to use as shell to clip w1.自动转换为二进制格式。w2中只有非零元素在wc中保持非零。注:假定形状与W1相同

outSP : 布尔

如果为真(默认值),则返回剪裁的w的稀疏版本;如果为假,则返回剪裁矩阵的w对象

silence_warnings : 布尔

切换到“关闭(默认打开)”打印带有孤岛的每个观测的语句

返回:
wc : W

w,scipy.sparse.csr.csr_matrix clipped w对象(如果outsp=ture,则稀疏)。它继承 id_order 来自W1。

实例

>>> from pysal.lib.weights import lat2W

首先,使用皇后连续性从晶格创建一个W对象,并对其进行行标准化(请注意,当我们剪裁对象时,这些权重将保持不变,但它们不再必然代表行标准化):

>>> w1 = lat2W(3, 2, rook=False)
>>> w1.transform = 'R'

假设观测值0、2、3和4属于一个组,1、5属于另一个组,我们不希望两个组在我们的权重中相互作用(即,如果i和j属于不同组,则w_i j=0)。为此,我们使用以下方法:

>>> import pysal.lib
>>> w2 = pysal.lib.weights.util.block_weights(['r1', 'r2', 'r1', 'r1', 'r1', 'r2'])

为了说明W2只被认为是二进制的,即使传递的对象不是二进制的,我们可以对它进行行标准化。

>>> w2.transform = 'R'

剪裁对象 wc 将只包含一个组(“r1”或“r2”)内发生的空间皇后关系,但将消除跨组发生的关系。

>>> wcs = pysal.lib.weights.set_operations.w_clip(w1, w2, outSP=True)

这将创建一个稀疏对象(当n较大时建议使用)。

>>> wcs.sparse.toarray()
array([[0.        , 0.        , 0.33333333, 0.33333333, 0.        ,
        0.        ],
       [0.        , 0.        , 0.        , 0.        , 0.        ,
        0.        ],
       [0.2       , 0.        , 0.        , 0.2       , 0.2       ,
        0.        ],
       [0.2       , 0.        , 0.2       , 0.        , 0.2       ,
        0.        ],
       [0.        , 0.        , 0.33333333, 0.33333333, 0.        ,
        0.        ],
       [0.        , 0.        , 0.        , 0.        , 0.        ,
        0.        ]])

如果我们想要一个原始的W对象,我们可以通过参数来控制它。 outSP

>>> wc = pysal.lib.weights.set_operations.w_clip(w1, w2, outSP=False)

警告:有2个断开连接的观测岛ID:[1,5]>>>wc.full()[0]数组([[0)。,0。,0.33333333,0.33333333,0.,

  1. ],请
〔0〕。,0。,0。,0。,0。,
  1. ],请
[0.2,0.,0。,0.2,0.2,
  1. ],请
[0.2,0.,0.2,0.0.2,
  1. ],请
〔0〕。,0。,0.33333333,0.33333333,0.,
  1. ],请
〔0〕。,0。,0。,0。,0。,
  1. ])

您可以检查它们实际上是相同的:

>>> wcs.sparse.toarray() == wc.full()[0]
array([[ True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True]])