小编sla*_*law的帖子

用Numpy矢量化操作替换For循环

在下面的代码中,我有一个简单的for循环,我想替换它,希望是一个更快的矢量化numpy操作.

import numpy as np

b = np.array([9,8100,-60,7], dtype=np.float64)
a = np.array([584,-11,23,79,1001,0,-19], dtype=np.float64)
m = 3
n = b.shape[0]
l = n-m+1
k = a.shape[0]-m+1

QT = np.array([-85224., 181461., 580047., 8108811., 10149.])
QT_first = QT.copy()

out = [None] * l
for i in range(1, l):
    QT[1:] = QT[:k-1] - b[i-1]*a[:k-1] + b[i-1+m]*a[-(k-1):]
    QT[0] = QT_first[i]

    # Update: Use this QT to do something with the ith element of array x
    # As i updates in each iteration, QT changes
    out[i] …
Run Code Online (Sandbox Code Playgroud)

python numpy

4
推荐指数
2
解决办法
935
查看次数

具有不同边缘值的 Networkx Spring 布局

我是 Networkx 的新手,并试图弄清楚如何使用 spring 布局,但在节点之间应用不同的边缘值(即,节点之间的不同距离)而不是相同的边缘值。

本质上,我想要一个图,它试图维护一组预定义的节点-节点距离(可能使用弹簧布局来找到一些局部最小值),其中某些边的权重高于其他边。但是,Networkx 文档表明所有边都将具有相同的权重。

此外,在绘制 spring_layout 图的一个简单案例中,我注意到每次运行时生成的图都会改变构象。有没有办法恢复相同的图形(即设置一些随机种子)?

import networkx as nx
G = nx.path_graph(5)
nx.draw(G) 
Run Code Online (Sandbox Code Playgroud)

python graph networkx

3
推荐指数
1
解决办法
9740
查看次数

当类的属性包含 self 的实例时如何指定 numba jitclass

我有一个简单的 Python 类:

class Node(object):
    def __init__(self):
        self._left = self
        self._right = self

    @property
    def left(self):
        return self._left

    @left.setter
    def left(self, value):
        self._left = value

    @property
    def right(self):
        return self._right

    @right.setter
    def right(self, value):
        self._right = value
Run Code Online (Sandbox Code Playgroud)

我想 jit 这个类,但不清楚如何在self._leftself._rightNode对象类型时定义类型。我遇到了另一个答案.class_type.instance_type,但该示例仅引用包含不同类实例的类属性。就我而言,由于Node尚未定义,我无法声明以下规范:

spec=[("_left", Node.class_type.instance_type),
      ("_right", Node.class_type.instance_type),
     ]

@jitclass(spec)
class Node(object):
Run Code Online (Sandbox Code Playgroud)

python jit class numba

3
推荐指数
1
解决办法
1060
查看次数

检查Scipy稀疏矩阵的密度

有没有一种很好的方法来测量或检查scipy.sparse矩阵的密度?

例如:

import scipy.sparse
import numpy as np

row  = np.array([0,3,1,0])
col  = np.array([0,3,1,2])
data = np.array([4,5,7,9])

mat = scipy.sparse.coo_matrix((data,(row,col)), shape=(4,4))
print mat.todense()

[[4 0 9 0]
 [0 7 0 0]
 [0 0 0 0]
 [0 0 0 5]]
Run Code Online (Sandbox Code Playgroud)

也许返回的东西可以让我获得总体密度的一般统计信息,例如每行的平均占用率(即第一行占2/4值,第二行占1/4,第三行占0/4,第四行占1/4因此平均占用率/密度将为1/4),stddev,方差等。也许可以采用一种更好的密度度量标准,而该密度度量标准不依赖于矩阵的大小(假设其足够大)。

python numpy scipy sparse-matrix

2
推荐指数
2
解决办法
3656
查看次数

继承父构造函数

我是Perl继承的新手,并且无法找到继承父构造函数的明确指令.我假设父类中的所有方法(包括构造函数)都是继承的,但看起来并非如此.所以,这还不够:

package Child;
use strict;
use Parent;
our @ISA=qw(Parent);
Run Code Online (Sandbox Code Playgroud)

相反,我需要添加一个调用父构造函数的构造函数:

package Child;
use strict;
use Parent;
our @ISA=qw(Parent);

sub new {
  my $self=Parent::new(shift);
  bless $self;
  return $self;
}
Run Code Online (Sandbox Code Playgroud)

也许有人可以为我澄清逻辑并告诉我是否继承父构造函数而不执行上面的操作(显式声明并调用父构造函数)?

perl inheritance constructor

1
推荐指数
1
解决办法
217
查看次数

遍历1D Numpy阵列进行群集

我有一个1维的numpy数组,其中每个元素的值i指向数组中的另一个索引.每个集群中心都有一个唯一的负(整数)值.目标是将每个元素分配给一个集群.

# Generated/pre-computed elsewhere
a = np.array([6, 8, 1, -1, 0, 3, -2, 4, -3, 10, 5])
Run Code Online (Sandbox Code Playgroud)

因此,聚类中心是元素3,6和8(因为它们具有负值)并且它们分别被标记为聚类-1,-2和-3.所以,从那以后

a[0] = 6 --> a[6] = -2, 
Run Code Online (Sandbox Code Playgroud)

然后a [0]可以指定为-2.同样,因为

a[5] = 3 --> a[3] = -1,
Run Code Online (Sandbox Code Playgroud)

然后a [5]可以指定为-1.遵循此逻辑,然后可以将所有元素分配给集群中心.结果数组将是:

[-2, -3, -3, -1, -2, -1, -2, -2, -3, -1, -1]
Run Code Online (Sandbox Code Playgroud)

我知道如何在纸上实现这一点,但我不知道如何在代码中实现这一点或在numpy中使用矢量化代码.

更新:根据下面unutbu的答案,我用for循环替换了while循环,以避免无限循环:

a = np.array([6, 8, 1, -1, 0, 3, -2, 4, -3, 10, 5])
for i in range(len(a)):
    mask = a >= 0
    if not mask.any(): break
    a[mask] …
Run Code Online (Sandbox Code Playgroud)

python arrays numpy traversal

1
推荐指数
1
解决办法
614
查看次数