libpysal.weights.W¶
-
class libpysal.weights.W(neighbors, weights=
None, id_order=None, silence_warnings=False, ids=None)[source]¶ Spatial weights class. Class attributes are described by their docstrings. to view, use the
helpfunction.Examples
>>> from libpysal.weights import W >>> neighbors = {0: [3, 1], 1: [0, 4, 2], 2: [1, 5], 3: [0, 6, 4], 4: [1, 3, 7, 5], 5: [2, 4, 8], 6: [3, 7], 7: [4, 6, 8], 8: [5, 7]} >>> weights = {0: [1, 1], 1: [1, 1, 1], 2: [1, 1], 3: [1, 1, 1], 4: [1, 1, 1, 1], 5: [1, 1, 1], 6: [1, 1], 7: [1, 1, 1], 8: [1, 1]} >>> w = W(neighbors, weights) >>> "%.3f"%w.pct_nonzero '29.630'Read from external .gal file.
>>> import libpysal >>> w = libpysal.io.open(libpysal.examples.get_path("stl.gal")).read() >>> w.n 78 >>> "%.3f"%w.pct_nonzero '6.542'Set weights implicitly.
>>> neighbors = {0: [3, 1], 1: [0, 4, 2], 2: [1, 5], 3: [0, 6, 4], 4: [1, 3, 7, 5], 5: [2, 4, 8], 6: [3, 7], 7: [4, 6, 8], 8: [5, 7]} >>> w = W(neighbors) >>> round(w.pct_nonzero,3) 29.63 >>> from libpysal.weights import lat2W >>> w = lat2W(100, 100) >>> w.trcW2 39600.0 >>> w.trcWtW 39600.0 >>> w.transform='r' >>> round(w.trcW2, 3) 2530.722 >>> round(w.trcWtW, 3) 2533.667Cardinality Histogram:
>>> w.histogram [(2, 4), (3, 392), (4, 9604)]Disconnected observations (islands):
>>> from libpysal.weights import W >>> w = W({1:[0],0:[1],2:[], 3:[]})UserWarning: The weights matrix is not fully connected: There are 3 disconnected components. There are 2 islands with ids: 2, 3.
Create a spatial weights object.
- Parameters:¶
- neighbors : dict¶
Key is region ID, value is a list of neighbor IDS. For example,
{'a':['b'],'b':['a','c'],'c':['b']}.- weights : dict¶
Key is region ID, value is a list of edge weights. If not supplied all edge weights are assumed to have a weight of 1. For example,
{'a':[0.5],'b':[0.5,1.5],'c':[1.5]}.- id_order : list¶
An ordered list of ids, defines the order of observations when iterating over
Wif not set, lexicographical ordering is used to iterate and theid_order_setproperty will returnFalse. This can be set after creation by setting theid_orderproperty.- silence_warnings : bool¶
By default
libpysalwill print a warning if the dataset contains any disconnected components or islands. To silence this warning set this parameter toTrue.- ids : list¶
Values to use for keys of the neighbors and weights
dictobjects.
Methods
asymmetry([intrinsic])Asymmetry check.
from_WSP(WSP[, silence_warnings])Create a pysal W from a pysal WSP object (thin weights matrix).
from_adjlist(adjlist[, focal_col, ...])Return an adjacency list representation of a weights object.
from_file([path, format])Read a weights file into a W object.
from_networkx(graph[, weight_col])Convert a
networkxgraph to a PySALWobject.from_shapefile(*args, **kwargs)from_sparse(sparse)Convert a
scipy.sparsearray to a PySALWobject.full()Generate a full
numpy.ndarray.Getter for transform property.
plot(gdf[, indexed_on, ax, color, node_kws, ...])Plot spatial weights objects.
remap_ids(new_ids)In place modification throughout
Wof id values fromw.id_ordertonew_idsin all.set_shapefile(shapefile[, idVariable, full])Adding metadata for writing headers of
.galand.gwtfiles.set_transform([value])Transformations of weights.
symmetrize([inplace])Construct a symmetric KNN weight.
to_WSP()Generate a
WSPobject.to_adjlist([remove_symmetric, drop_islands, ...])Compute an adjacency list representation of a weights object.
to_file([path, format])Write a weights to a file.
Convert a weights object to a
networkxgraph.to_sparse([fmt])Generate a
scipy.sparsearray object from a pysal W.Attributes
List of id pairs with asymmetric weights sorted in ascending index location order.
Number of neighbors for each observation.
Store the graph component in which each observation falls.
Diagonal of \(WW\).
Diagonal of \(W^{'}W\).
Diagonal of \(W^{'}W + WW\).
Cardinality histogram as a dictionary where key is the id and value is the number of neighbors for that unit.
Dictionary where the key is an ID and the value is that ID's index in
W.id_order.Returns the ids for the observations in the order in which they would be encountered if iterating over the weights.
Returns
Trueif user has setid_order,Falseif not.List of ids without any neighbors.
Largest number of neighbors.
Average number of neighbors.
Minimum number of neighbors.
Number of units.
Store whether the adjacency matrix is fully connected.
Given the current
id_order,neighbor_offsets[id]is the offsets of the id's neighbors inid_order.Number of nonzero weights.
Percentage of nonzero weights.
s0is defined ass1is defined ass2is defined asIndividual elements comprising
s2.Standard deviation of number of neighbors.
Sparse matrix object.
Getter for transform property.
Trace of \(WW\).
Trace of \(W^{'}W\).
Trace of \(W^{'}W + WW\).
- property asymmetries[source]¶
List of id pairs with asymmetric weights sorted in ascending index location order.
-
asymmetry(intrinsic=
True)[source]¶ Asymmetry check.
- Parameters:¶
- Returns:¶
asymmetries – Empty if no asymmetries are found. If there are asymmetries, then a
listof(i,j)tuples is returned sorted in ascending index location order.- Return type:¶
Examples
>>> from libpysal.weights import lat2W >>> w=lat2W(3,3) >>> w.asymmetry() [] >>> w.transform='r' >>> w.asymmetry() [(0, 1), (0, 3), (1, 0), (1, 2), (1, 4), (2, 1), (2, 5), (3, 0), (3, 4), (3, 6), (4, 1), (4, 3), (4, 5), (4, 7), (5, 2), (5, 4), (5, 8), (6, 3), (6, 7), (7, 4), (7, 6), (7, 8), (8, 5), (8, 7)] >>> result = w.asymmetry(intrinsic=False) >>> result [] >>> neighbors={0:[1,2,3], 1:[1,2,3], 2:[0,1], 3:[0,1]} >>> weights={0:[1,1,1], 1:[1,1,1], 2:[1,1], 3:[1,1]} >>> w=W(neighbors,weights) >>> w.asymmetry() [(0, 1), (1, 0)]
-
classmethod from_WSP(WSP, silence_warnings=
True)[source]¶ Create a pysal W from a pysal WSP object (thin weights matrix).
Examples
>>> from libpysal.weights import lat2W, WSP, WBuild a 10x10 scipy.sparse matrix for a rectangular 2x5 region of cells (rook contiguity), then construct a PySAL sparse weights object (wsp).
>>> sp = lat2SW(2, 5) >>> wsp = WSP(sp) >>> wsp.n 10 >>> wsp.sparse[0].todense() matrix([[0, 1, 0, 0, 0, 1, 0, 0, 0, 0]], dtype=int8)Create a standard PySAL W from this sparse weights object.
>>> w = W.from_WSP(wsp) >>> w.n 10 >>> print(w.full()[0][0]) [0 1 0 0 0 1 0 0 0 0]
-
classmethod from_adjlist(adjlist, focal_col=
'focal', neighbor_col='neighbor', weight_col=None)[source]¶ Return an adjacency list representation of a weights object.
- Parameters:¶
- adjlist : pandas.DataFrame¶
Adjacency list with a minimum of two columns.
- focal_col : str¶
Name of the column with the “source” node ids.
- neighbor_col : str¶
Name of the column with the “destination” node ids.
- weight_col : str¶
Name of the column with the weight information. If not provided and the dataframe has no column named “weight” then all weights are assumed to be 1.
-
classmethod from_networkx(graph, weight_col=
'weight')[source]¶ Convert a
networkxgraph to a PySALWobject.
- classmethod from_sparse(sparse)[source]¶
Convert a
scipy.sparsearray to a PySALWobject.- Parameters:¶
- sparse : scipy.sparse array¶
- Returns:¶
w – A
Wobject containing the same graph as thescipy.sparsegraph.- Return type:¶
Notes
When the sparse array has a zero in its data attribute, and the corresponding row and column values are equal, the value for the pysal weight will be 0 for the “loop”.
- full()[source]¶
Generate a full
numpy.ndarray.- Returns:¶
(fullw, keys) – The first element being the full
numpy.ndarrayand second element keys being the ids associated with each row in the array.- Return type:¶
Examples
>>> from libpysal.weights import W, full >>> neighbors = { ... 'first':['second'],'second':['first','third'],'third':['second'] ... } >>> weights = {'first':[1],'second':[1,1],'third':[1]} >>> w = W(neighbors, weights) >>> wf, ids = full(w) >>> wf array([[0., 1., 0.], [1., 0., 1.], [0., 1., 0.]]) >>> ids ['first', 'second', 'third']
- get_transform()[source]¶
Getter for transform property.
- Returns:¶
transformation – Valid transformation value. See the
transformparameters inset_transform()for a detailed description.- Return type:¶
str, None
Examples
>>> from libpysal.weights import lat2W >>> w=lat2W() >>> w.weights[0] [1.0, 1.0] >>> w.transform 'O' >>> w.transform='r' >>> w.weights[0] [0.5, 0.5] >>> w.transform='b' >>> w.weights[0] [1.0, 1.0]See also
- property histogram[source]¶
Cardinality histogram as a dictionary where key is the id and value is the number of neighbors for that unit.
- property id2i[source]¶
Dictionary where the key is an ID and the value is that ID’s index in
W.id_order.
- property id_order[source]¶
Returns the ids for the observations in the order in which they would be encountered if iterating over the weights.
- property id_order_set[source]¶
Returns
Trueif user has setid_order,Falseif not.Examples
>>> from libpysal.weights import lat2W >>> w=lat2W() >>> w.id_order_set True
- property neighbor_offsets[source]¶
Given the current
id_order,neighbor_offsets[id]is the offsets of the id’s neighbors inid_order.Examples
>>> from libpysal.weights import W >>> neighbors={'c': ['b'], 'b': ['c', 'a'], 'a': ['b']} >>> weights ={'c': [1.0], 'b': [1.0, 1.0], 'a': [1.0]} >>> w=W(neighbors,weights) >>> w.id_order = ['a','b','c'] >>> w.neighbor_offsets['b'] [2, 0] >>> w.id_order = ['b','a','c'] >>> w.neighbor_offsets['b'] [2, 1]
-
plot(gdf, indexed_on=
None, ax=None, color='k', node_kws=None, edge_kws=None)[source]¶ Plot spatial weights objects. Requires
matplotlib, and implicitly requires ageopandas.GeoDataFrameas input.- Parameters:¶
- gdf : geopandas.GeoDataFrame¶
The original shapes whose topological relations are modelled in
W.- indexed_on : str¶
Column of
geopandas.GeoDataFramethat the weights object uses as an index. Default isNone, so the index of thegeopandas.GeoDataFrameis used.- ax : matplotlib.axes.Axes¶
Axis on which to plot the weights. Default is
None, so plots on the current figure.- color : str¶
matplotlibcolor string, will color both nodes and edges the same by default.- node_kws : dict¶
Keyword arguments dictionary to send to
pyplot.scatter, which provides fine-grained control over the aesthetics of the nodes in the plot.- edge_kws : dict¶
Keyword arguments dictionary to send to
pyplot.plot, which provides fine-grained control over the aesthetics of the edges in the plot.
- Returns:¶
f (matplotlib.figure.Figure) – Figure on which the plot is made.
ax (matplotlib.axes.Axes) – Axis on which the plot is made.
Notes
If you’d like to overlay the actual shapes from the
geopandas.GeoDataFrame, callgdf.plot(ax=ax)after this. To plot underneath, adjust the z-order of the plot as follows:gdf.plot(ax=ax,zorder=0).Examples
>>> from libpysal.weights import Queen >>> import libpysal as lp >>> import geopandas >>> gdf = geopandas.read_file(lp.examples.get_path("columbus.shp")) >>> weights = Queen.from_dataframe(gdf) >>> tmp = weights.plot( ... gdf, color='firebrickred', node_kws=dict(marker='*', color='k') ... )
- remap_ids(new_ids)[source]¶
In place modification throughout
Wof id values fromw.id_ordertonew_idsin all.- Parameters:¶
Examples
>>> from libpysal.weights import lat2W >>> w = lat2W(3, 3) >>> w.id_order [0, 1, 2, 3, 4, 5, 6, 7, 8] >>> w.neighbors[0] [3, 1] >>> new_ids = ['id%i'%id for id in w.id_order] >>> _ = w.remap_ids(new_ids) >>> w.id_order ['id0', 'id1', 'id2', 'id3', 'id4', 'id5', 'id6', 'id7', 'id8'] >>> w.neighbors['id0'] ['id3', 'id1']
-
set_shapefile(shapefile, idVariable=
None, full=False)[source]¶ Adding metadata for writing headers of
.galand.gwtfiles.- Parameters:¶
-
set_transform(value=
'B')[source]¶ Transformations of weights.
- Parameters:¶
Notes
Transformations are applied only to the value of the weights at instantiation. Chaining of transformations cannot be done on a
Winstance.Examples
>>> from libpysal.weights import lat2W >>> w=lat2W() >>> w.weights[0] [1.0, 1.0] >>> w.transform 'O' >>> w.transform='r' >>> w.weights[0] [0.5, 0.5] >>> w.transform='b' >>> w.weights[0] [1.0, 1.0]
- property sparse[source]¶
Sparse matrix object. For any matrix manipulations required for w,
w.sparseshould be used. This is based onscipy.sparse.
-
symmetrize(inplace=
False)[source]¶ Construct a symmetric KNN weight. This ensures that the neighbors of each focal observation consider the focal observation itself as a neighbor. This returns a generic
Wobject, since the object is no longer guaranteed to havekneighbors for each observation.
- to_WSP()[source]¶
Generate a
WSPobject.Examples
>>> from libpysal.weights import W, WSP >>> neighbors={'first':['second'],'second':['first','third'],'third':['second']} >>> weights={'first':[1],'second':[1,1],'third':[1]} >>> w=W(neighbors,weights) >>> wsp=w.to_WSP() >>> isinstance(wsp, WSP) True >>> wsp.n 3 >>> wsp.s0 4See also
-
to_adjlist(remove_symmetric=
False, drop_islands=None, focal_col='focal', neighbor_col='neighbor', weight_col='weight', sort_joins=False)[source]¶ Compute an adjacency list representation of a weights object.
- Parameters:¶
- remove_symmetric : bool¶
Whether or not to remove symmetric entries. If the
Wis symmetric, a standard directed adjacency list will contain both the forward and backward links by default because adjacency lists are a directed graph representation. If this isTrue, aWcreated from this adjacency list MAY NOT BE THE SAME as the originalW. If you would like to consider (1,2) and (2,1) as distinct links, leave this asFalse.- drop_islands : bool¶
Whether or not to preserve islands as entries in the adjacency list. By default, observations with no neighbors do not appear in the adjacency list. If islands are kept, they are coded as self-neighbors with zero weight.
- focal_col : str¶
Name of the column in which to store “source” node ids.
- neighbor_col : str¶
Name of the column in which to store “destination” node ids.
- weight_col : str¶
Name of the column in which to store weight information.
- sort_joins : bool¶
Whether or not to lexicographically sort the adjacency list by (focal_col, neighbor_col). Default is False.
-
to_file(path=
'', format=None)[source]¶ Write a weights to a file. The format is guessed automatically from the path, but can be overridden with the format argument.
See libpysal.io.FileIO for more information.
- to_networkx()[source]¶
Convert a weights object to a
networkxgraph.- Return type:¶
A
networkxgraph representation of theWobject.
-
to_sparse(fmt=
'coo')[source]¶ Generate a
scipy.sparsearray object from a pysal W.- Parameters:¶
- fmt : {'bsr', 'coo', 'csc', 'csr'}¶
scipy.sparse format
- Returns:¶
A scipy.sparse array with a format of fmt.
- Return type:¶
scipy.sparse array
Notes
The keys of the w.neighbors are encoded to determine row,col in the sparse array.
- property transform[source]¶
Getter for transform property.
- Returns:¶
transformation – Valid transformation value. See the
transformparameters inset_transform()for a detailed description.- Return type:¶
str, None
Examples
>>> from libpysal.weights import lat2W >>> w=lat2W() >>> w.weights[0] [1.0, 1.0] >>> w.transform 'O' >>> w.transform='r' >>> w.weights[0] [0.5, 0.5] >>> w.transform='b' >>> w.weights[0] [1.0, 1.0]See also