有人可以为我提供更好的(更简单,更可读,更Pythonic,更高效等)从数组中删除多个值的方法,而不是以下内容:
import numpy as np
# The array.
x = np.linspace(0, 360, 37)
# The values to be removed.
a = 0
b = 180
c = 360
new_array = np.delete(x, np.where(np.logical_or(np.logical_or(x == a,
x == b),
x == c)))
Run Code Online (Sandbox Code Playgroud)
这个问题的一个好答案会产生与上面代码相同的结果(即new_array),但是在处理浮点数之间的相等性方面可能比上面的代码更好.
有人可以向我解释为什么会产生错误的结果吗?
In [5]: np.delete(x, x == a)
/usr/lib/python2.7/dist-packages/numpy/lib/function_base.py:3254: FutureWarning: in the future insert will treat boolean arrays and array-likes as boolean index instead of casting it to integer
"of casting it to integer", FutureWarning)
Out[5]:
array([ …Run Code Online (Sandbox Code Playgroud) 我有以下代码(为简洁起见而简化):
import os
import errno
import imp
lib_dir = os.path.expanduser('~/.brian/cython_extensions')
module_name = '_cython_magic_5'
module_path = os.path.join(lib_dir, module_name + '.so')
code = 'some code'
have_module = os.path.isfile(module_path)
if not have_module:
pyx_file = os.path.join(lib_dir, module_name + '.pyx')
# THIS IS WHERE EACH PROCESS TRIES TO WRITE TO THE FILE. THE CODE HERE
# PREVENTS A RACE CONDITION.
try:
fd = os.open(pyx_file, os.O_CREAT | os.O_EXCL | os.O_WRONLY)
except OSError as e:
if e.errno == errno.EEXIST:
pass
else:
raise
else:
os.fdopen(fd, 'w').write(code)
# THIS …Run Code Online (Sandbox Code Playgroud) 假设我有两个数组,
import numpy as np
x = np.array([1, 2, 3, 4])
y = np.array([5, 6, 7, 8])
Run Code Online (Sandbox Code Playgroud)
获取新数组 的最快、最 Pythonic 等方式是什么,z其元素数量等于x.size * y.size,其中元素是(x_i, y_j)两个输入数组中每对元素的乘积。
换句话说,我正在寻找一个数组,z其中.z[k]x[i] * y[j]
一种简单但低效的方法如下:
z = np.empty(x.size * y.size)
counter = 0
for i in x:
for j in y:
z[counter] = i * j
counter += 1
Run Code Online (Sandbox Code Playgroud)
运行上面的代码可以看出,z在这个例子中是
In [3]: z
Out[3]:
array([ 5., 6., 7., 8., 10., 12., 14., 16., 15., 18., …Run Code Online (Sandbox Code Playgroud) 如何将numpy arrayfrom类型转换'float64'为type 'float'?具体来说,我怎么转换整个array用dtype 'float64'有dtype 'float'?这可能吗? 在上面的重复思考问题中,标量的答案并没有解决我的问题.
考虑一下:
>>> type(my_array[0])
<type 'numpy.float64'>
>>> # Let me try to convert this to 'float':
>>> new_array = my_array.astype(float)
>>> type(new_array[0])
<type 'numpy.float64'>
>>> # No luck. What about this:
>>> new_array = my_array.astype('float')
>>> type(new_array[0])
<type 'numpy.float64'>
>>> # OK, last try:
>>> type(np.inf)
<type 'float'>
>>> # Yeah, that's what I want.
>>> new_array = my_array.astype(type(np.inf))
>>> …Run Code Online (Sandbox Code Playgroud) 我正在将 Matlab 代码(由其他人编写)翻译为 Python。
在 Matlab 代码的一部分中,变量X_new被设置为从对数正态分布中得出的值,如下所示:
% log normal distribution
X_new = exp(normrnd(log(X_old), sigma));
Run Code Online (Sandbox Code Playgroud)
也就是说,从以 为中心的正态分布中抽取一个随机值log(X_old),并将X_new其设置为e提高到该值。
这段代码直接翻译成Python如下:
import numpy as np
X_new = np.exp(np.random.normal(np.log(X_old), sigma))
Run Code Online (Sandbox Code Playgroud)
但numpy包括可以直接采样的对数正态分布。
我的问题是,下面的代码行与上面的代码行等效吗?
X_new = np.random.lognormal(np.log(X_old), sigma)
Run Code Online (Sandbox Code Playgroud) 仅在两个数组都不为零的情况下,将一个numpy数组除以另一个(形状相同,在元素上相同)的最简单,最Pythonic的方法是什么?
除数或被除数为零时,输出数组中的相应元素应为零。(这是除数为零时的默认输出,而np.nan是除数为零时的默认输出。)
考虑以下功能:
import numpy as np
from scipy.special import erf
def my_func(x):
return np.exp(x ** 2) * (1 + erf(x))
Run Code Online (Sandbox Code Playgroud)
当我从评估此函数的积分-14来-4使用scipy的quad功能,我得到以下结果:
In [3]: from scipy import integrate
In [4]: integrate.quad(my_func, -14, -4)
/usr/local/lib/python2.7/dist-packages/scipy/integrate/quadpack.py:289: UserWarning: The maximum number of subdivisions (50) has been achieved.
If increasing the limit yields no improvement it is advised to analyze
the integrand in order to determine the difficulties. If the position of a
local difficulty can be determined …Run Code Online (Sandbox Code Playgroud) 在表格里面我有一个按钮.我通过这样的JavaScript提交表单时有什么区别
<button onclick="document.forms[0].submit();">
Run Code Online (Sandbox Code Playgroud)
当我像这样提交时
<button type="submit"></button>?
Run Code Online (Sandbox Code Playgroud)
第一个适用于大多数浏览器,除了基于webkit.后者也可以正常工作.我没有明显的功能差异.有吗?
我想编写一个函数来评估作为列表传递的后缀表达式。到目前为止,我有:
def evalPostfix(text):
s = Stack()
for symbol in text:
if symbol in "0123456789":
s.push(int(symbol))
if not s.is_empty():
if symbol == "+":
plus = s.pop() + s.pop()
if symbol == "-":
plus = s.pop() - s.pop()
if symbol == "*":
plus = s.pop() * s.pop()
if symbol == "/":
plus = s.pop() / s.pop()
Run Code Online (Sandbox Code Playgroud)
但我认为我有错误的方法。帮助?
我有两个列表,x并且y:
>>> x = [2, 3, 4]
>>> y = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
我想用这些来创建一个新列表.新列表将使每个元素x重复由相应元素指定的次数y.因此,期望的输出是
>>> new_list
[2, 3, 3, 4, 4, 4]
Run Code Online (Sandbox Code Playgroud)
元素的顺序new_list对我来说无关紧要.它也不是至关重要的list- 任何序列类型都可以.
实现这一目标的最快,最有效,最恐怖的方法是什么?