因为对于我的程序来说,快速索引Numpy数组是非常必要的,并且花哨的索引在考虑性能方面没有良好的声誉,我决定进行一些测试.特别是因为Numba发展很快,我尝试了哪种方法与numba配合得很好.
作为输入,我一直在使用以下数组进行小型数组测试:
import numpy as np
import numba as nb
x = np.arange(0, 100, dtype=np.float64) # array to be indexed
idx = np.array((0, 4, 55, -1), dtype=np.int32) # fancy indexing array
bool_mask = np.zeros(x.shape, dtype=np.bool) # boolean indexing mask
bool_mask[idx] = True # set same elements as in idx True
y = np.zeros(idx.shape, dtype=np.float64) # output array
y_bool = np.zeros(bool_mask[bool_mask == True].shape, dtype=np.float64) #bool output array (only for convenience)
Run Code Online (Sandbox Code Playgroud)
以下数组用于我的大型数组测试(y_bool此处需要处理重复数字randint):
x = …Run Code Online (Sandbox Code Playgroud) 我有一个pandas(版本 1.0.5)DataFrame有MultiIndex两个级别的 a,例如:
mi = pd.MultiIndex.from_product((('a', 'c'), (5, 12)))
np.random.seed(123)
df = pd.DataFrame(data=np.random.rand(4, 2), index=mi, columns=['x', 'y'])
Run Code Online (Sandbox Code Playgroud)
我想在 MultiIndexreindex的第一级包含键['a', 'b', 'c', 'd']。缺失的值应该用np.nan.
对于非多索引数据帧,我只需使用df.reindex(index=['a', 'b', 'c', 'd']).
现在有了MultiIndex,我认为这应该可以工作(我还尝试了所有其他参数组合labels,axis和index):
df.reindex(index=['a', 'b', 'c', 'd'], level=0)
Run Code Online (Sandbox Code Playgroud)
但相反,它似乎完全忽略了该reindex方法并返回未更改的数据帧:
x y
a 5 0.696469 0.286139
12 0.226851 0.551315
c 5 0.719469 0.423106
12 0.980764 0.684830 …Run Code Online (Sandbox Code Playgroud) 在python中是否可能直接在三元语句中引发错误?
如:
import numpy as np
y = np.random.rand(200, 5, 5)
y = (y[:, None] if y.ndim == 1
else y if y.ndim == 2
else raise ValueError('`y` must be given as a 1D or 2D array.'))
Run Code Online (Sandbox Code Playgroud)
当然,可以使用简单的if / elif / else语句来完成此操作。因此,我专门要求使用“单行”三元语句的解决方案。
只是为了澄清:
我知道三元语句无意引起错误,并且根据PEP8等,它也不是很好的样式。我只是在问是否有可能。
当使用相同的 key 传递两个关键字参数时,我在定义用户友好的函数接口时遇到了一些麻烦。
问题
调用两个关键字参数具有相同键并且第二个关键字参数具有优先级的函数的最佳方法是什么?
如果出现此问题,第一个关键字参数始终来自a 中的解压缩数据库dict,而第二个关键字参数始终通过“直接”将其作为关键字参数来传递。
数据库字典值不得在函数的外部副本中被覆盖,因为它们可能会被多次使用。
编辑:为了保持用户功能的可用性,首选后端实现。这意味着用户可以简单地将参数传递给函数,而无需使用其他模块,而函数本身则完成所有的魔力。
问题
我有一个函数,fun_one在此处调用,它接收由程序用户直接定义的多个参数。例如,这可以是length热交换器width。为了方便函数的使用并使调用代码尽可能短,鼓励使用数据库。dict这些数据库包含(或 pandas 系列)中的数据,在本例中称为inputs.
为了将database-传递dict inputs给函数,它被解压缩**inputs并作为关键字参数传递。
现在,如果用户想要覆盖数据库的特定参数,我对用户友好方法的理解是让他再次传递前面的参数,例如使用length=23.7,并在内部覆盖数据库中的参数。但是当然(请参阅示例代码)这会在我什至可以输入我可以输入的函数之前引发错误try/except:
类型错误:fun_one() 获得关键字参数“length”的多个值
重现错误的代码示例
def fun_one(*args, **kwargs): # short example function
print(kwargs)
inputs = {'length': 15.8, 'width': 1.1, 'some_other_args': np.random.rand(3)}
fun_one(**inputs, length=23.7)
Run Code Online (Sandbox Code Playgroud)
我目前的解决方案
我当前的解决方案fun_two涉及不解压缩数据库并将其传递到*args. 它检查*argss并将尚未包含在 …
我有以下数据框:
S A
1 1
1 0
2 1
2 0
Run Code Online (Sandbox Code Playgroud)
我想创建一个'Result'基于 A 列和 S 列的值计算的新列。
我写了以下嵌套np.where代码
df['Result'] = np.where((df.S == 1 & df.A == 1), 1,
(df.S == 1 & df.A == 0), 0,
(df.S == 2 & df.A == 1), 0,
(df.S == 2 & df.A == 0), 1))))
Run Code Online (Sandbox Code Playgroud)
但是当我执行它时,我收到以下错误:
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
我的代码有什么问题?
我正在尝试使用 sklearn 的RANSAC: RANdom SAmple Consensus算法拟合一个没有截距的线性模型(强制截距为 0)。在LinearRegression 中,可以轻松设置fit_intercept=False. 但是,RANSAC 的可能参数列表中似乎不存在此选项。这个功能没有实现吗?应该怎么做?sklearn 的 RANSAC 有哪些替代方法可以客观地选择内点和离群点,允许将截距设置为 0?
实现应该是这样的,但它引发了一个错误:
from sklearn.linear_model import RANSACRegressor
ransac_regressor = RANSACRegressor(fit_intercept=False)
Run Code Online (Sandbox Code Playgroud) 我目前正在 python 中的建模环境中使用 dicts 来共享连接部件的连接属性。我目前这样做的方式大约需要我的总程序运行时间的 15-20%,这是相当多的有几百万次迭代......
所以我发现自己正在研究如何加快更新 dicts 中的多个值并从 dicts 中获取多个值。
我的示例 dict 看起来像这样(键值对的数量预计将保持在 300 到 1000 的当前范围内,因此我将其填充到这个数量):
val_dict = {'a': 5.0, 'b': 18.8, 'c': -55/2}
for i in range(200):
val_dict[str(i)] = i
val_dict[i] = i**2
keys = ('b', 123, '89', 'c')
new_values = np.arange(10, 41, 10)
length = new_values.shape[0]
Run Code Online (Sandbox Code Playgroud)
虽然键值对keys的形状new_values和数量val_dict将始终保持不变,但每次迭代时的变化值都必须在每次迭代时更新(并且也必须在每次迭代时从我的另一部分中检索)代码)。new_values
我对几种方法进行了计时,其中从 dicts获取多个值似乎是itemgetter从operator模块中使用最快的方法。我可以getter在迭代开始之前定义,因为所需的变量是常量:
getter = itemgetter(*keys)
%timeit …Run Code Online (Sandbox Code Playgroud) 我一直在尝试在 python 中实现一个使用反向传播的神经网络,但不断收到上述错误。我该如何消除它。该代码运行一个周期而不计算系统中的误差,因此它无法通过网络反向传播误差
import numpy as np
X = [0.4, 0.7]
y = [0.1]
class Neural_Network(object):
def __init__(self):
#parameters
self.inputSize = 2
self.outputSize = 1
self.hiddenSize = 2
#weights
self.W1 = [[0.1, 0.4],
[0.2, -0.2]] # (2x2) weight matrix from input to hidden layer
self.W2 = np.array([0.2, -0.5])[np.newaxis] # (2x1) weight matrix from hidden to output layer
def forward(self, X):
#forward propagation through our network
self.z = np.dot(X, self.W1) # dot product of X (input) and first set of 3x2 …Run Code Online (Sandbox Code Playgroud) 我这样做是为了对高分的列表进行排序:
with open("scores.csv", "r") as x:
reader = csv.DictReader(x)
scores = [] # Makes an empty listto store the scores
for row in reader:
scores.append([row["Name"], row["Score"]])
# Sorts the list by score
scores.sort(reverse=True, key=lambda x: x[1])
Run Code Online (Sandbox Code Playgroud)
但这是输出:
[['AnotherUser', '3'], ['James', '15'], ['James', '13'], ['User2', '12'], ['James', '0']]
Run Code Online (Sandbox Code Playgroud)
显然,结果应该是这样的:
[['James', '15'], ['James', '13'], ['User2', '12'], ['AnotherUser', '3'], ['James', '0']]
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?提前致谢 :)
python ×9
numpy ×2
pandas ×2
performance ×2
arguments ×1
cython ×1
dictionary ×1
function ×1
if-statement ×1
indexing ×1
numba ×1
scikit-learn ×1
sorting ×1