我有一组稀疏矩阵填充了布尔值,我需要执行逻辑运算(主要是元素方式OR).
如同在numpy中,用dtype ='bool'求和矩阵给出了元素的OR,但是有一个令人讨厌的副作用:
>>> from scipy import sparse
>>> [a,b] = [sparse.rand(5,5,density=0.1,format='lil').astype('bool')
... for x in range(2)]
>>> b
<5x5 sparse matrix of type '<class 'numpy.bool_'>'
with 2 stored elements in LInked List format>
>>> a+b
<5x5 sparse matrix of type '<class 'numpy.int8'>'
with 4 stored elements in Compressed Sparse Row format>
Run Code Online (Sandbox Code Playgroud)
数据类型更改为"int8",这会导致将来的操作出现问题.这可以通过以下方式得到解决:
(a+b).astype('bool')
Run Code Online (Sandbox Code Playgroud)
但我得到的印象是,所有这种类型的改变都会导致性能下降.
为什么结果的dtype与操作数不同?
有没有更好的方法在python中对稀疏矩阵进行逻辑运算?
我认为这是一个有点有趣的问题,即使只是从编程练习的角度来看.
我有一长串二进制模式,我希望将其缩减为更紧凑的形式以呈现给用户.要遵循的符号是' - '可以表示'1'或'0',因此['1011','1010']可以用['101-']和表示
['1100', '1000', '0100', '0000', '1111', '1011', '0111', '0011']
Run Code Online (Sandbox Code Playgroud)
可以用['--00', '--11'].来表示.请注意,所有模式的长度始终相同(尽管可能长于4位).
扩展模式相当简单,减少它们有点棘手.
我已经提出了一些可以实现这一目标的代码,但它很长,很慢,而且难以阅读.
def reducePatterns(patterns):
'''Reduce patterns into compact dash notation'''
newPatterns = [] #reduced patterns
matched = [] #indexes with a string that was already matched
for x,p1 in enumerate(patterns): #pattern1
if x in matched: continue #skip if this pattern has already been matched
for y,p2 in enumerate(patterns[x+1:],1):
if x+y in matched: continue #skip if this pattern has already been …Run Code Online (Sandbox Code Playgroud) 我一直在寻找一种方法(更有效,只是编写循环遍历矩阵)从包装对角线顺序给出的元素创建矩阵,并按此顺序提取值.举个例子,a = [2,3,4,5,6,7]我希望能够生成数组
[ 0, 2, 5, 7,
0, 0, 3, 6,
0, 0, 0, 4,
0, 0, 0, 0]
Run Code Online (Sandbox Code Playgroud)
并且还能够a从该阵列中重新提取.
scipy.sparse.diags实现了很多这样的东西,但顾名思义是为稀疏数组.numpy中是否有任何类型的功能可以提供此功能,或者某种形式的基于对角线的索引?或者也许某种类型的数组转换会使这更可行?
我正在查看我发现的一个有趣的示例脚本(在这个站点,最后一个示例行124),我正在努力理解particles这行中的逗号是什么:
particles, = ax.plot([], [], 'bo', ms=6)
Run Code Online (Sandbox Code Playgroud)
如果省略逗号,脚本将出现错误,但语法(似乎类似于解包语句)对我来说没有多大意义,并且像
a, = [2,3]
Run Code Online (Sandbox Code Playgroud)
失败,这似乎是反对解包理论的论据.
任何见解将不胜感激.