我有一个2D NumPy数组,并希望将其中的所有值替换为大于或等于阈值T的255.0.据我所知,最基本的方式是:
shape = arr.shape
result = np.zeros(shape)
for x in range(0, shape[0]):
for y in range(0, shape[1]):
if arr[x, y] >= T:
result[x, y] = 255
Run Code Online (Sandbox Code Playgroud)
什么是最简洁和pythonic的方式来做到这一点?
有没有更快(可能不那么简洁和/或更少pythonic)的方式来做到这一点?
这将是用于人体头部的MRI扫描的窗口/水平调整子程序的一部分.2D numpy数组是图像像素数据.
我有两个NxN矩阵,我想将它们相乘:A和B.在NumPy中,我使用了:
import numpy as np
C = np.dot(A, B)
Run Code Online (Sandbox Code Playgroud)
然而,我碰巧知道对于矩阵B,只有行n和列n是非零的(这直接来自产生矩阵的分析公式,并且毫无疑问总是如此).
希望利用这一事实并减少产生C所需的乘法次数,我将上述内容替换为:
import numpy as np
for row in range(0, N):
for col in range(0, N):
if col != n:
C[row, col] = A[row, n]*B[n, col] #Just one scalar multiplication
else:
C[row, col] = np.dot(A[row], B[:, n])
Run Code Online (Sandbox Code Playgroud)
从分析上看,这应该降低总复杂度如下:在一般情况下(不使用任何奇特的技巧,只是基本矩阵乘法)C = AB,其中A和B都是NxN,应该是O(N ^ 3).也就是说,所有N行必须乘以所有N列,并且这些点积中的每一个包含N次乘法=> O(N N N)= O(N ^ 3).
然而,如上所述,利用B的结构应当为O(N ^ 2 + N ^ 2)= O(2N ^ 2)= O(N ^ 2).也就是说,所有N行必须乘以所有N列,但是,对于所有这些行(除了那些涉及'B [:,n]'的那些),只需要一个标量乘法:只有一个'B [:,m]'的元素对于m!= n,它不为零.当n == m时,将发生N次(对于必须乘以B的n列的A的每一行一次),必须发生N个标量乘法.
但是,第一个代码块(使用np.dot(A,B))要快得多.我知道(通过以下信息:为什么矩阵乘法比numpy更快,而不是Python中的ctypes?)np.dot的低级实现细节很可能归咎于此.所以我的问题是:如何在不牺牲NumPy的实现效率的情况下利用矩阵B的结构来提高乘法效率,而不在c中构建我自己的低级矩阵乘法? …
我正在使用循环的每次迭代更新 3d 散点图。重绘绘图时,网格线“穿过”或“覆盖”点,这使我的数据更难以可视化。如果我构建单个 3d 绘图(无循环更新),则不会发生这种情况。下面的代码演示了最简单的情况:
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import time
X = np.random.rand(100, 3)*10
Y = np.random.rand(100, 3)*5
plt.ion()
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(X[:, 0], X[:, 1], X[:, 2])
plt.draw()
for i in range(0, 20):
time.sleep(3) #make changes more apparent/easy to see
Y = np.random.rand(100, 3)*5
ax.cla()
ax.scatter(Y[:, 0], Y[:, 1], Y[:, 2])
plt.draw()
Run Code Online (Sandbox Code Playgroud)
有没有其他人遇到过这个问题?
我有一个尺寸为row x cols x deps的3D图像.对于图像中的每个体素,我计算了一个3x3实对称矩阵.它们存储在阵列D中,因此具有形状(行,列,凹陷,6).
D为我的图像中的每个体素存储3x3对称矩阵的6个独特元素.我需要在矢量化代码中同时找到所有行*cols*deps矩阵的Moore-Penrose伪逆(循环遍历每个图像体素,并且在Python中反转太慢).
这些3x3对称矩阵中的一些是非奇异的,我可以在矢量化代码中找到它们的逆,使用非奇异3x3对称矩阵的真逆的解析公式,我已经这样做了.
然而,对于那些单数的矩阵(并且肯定会有一些),我需要Moore-Penrose伪逆.我可以得出一个真实的,奇异的,对称的3x3矩阵的MP的解析公式,但它是一个非常讨厌/冗长的公式,因此会涉及非常大量(元素方面)矩阵算法和相当多的混乱寻找代码.
因此,我想知道是否有一种方法可以同时在数字上同时找到所有这些矩阵的MP伪逆.有没有办法做到这一点?
感激不尽,GF
python ×4
numpy ×3
arrays ×1
loops ×1
matplotlib ×1
matrix ×1
performance ×1
replace ×1
scatter ×1