我正在为数学创建一个小程序(没有特别的原因,只是想要)并且我遇到了错误"TypeError:'NoneType'对象不可订阅.
我以前从未见过这个错误,所以我不知道这意味着什么.
import math
print("The format you should consider:")
print str("value 1a")+str(" + ")+str("value 2")+str(" = ")+str("value 3a ")+str("value 4")+str("\n")
print("Do not include the letters in the input, it automatically adds them")
v1 = input("Value 1: ")
v2 = input("Value 2: ")
v3 = input("Value 3: ")
v4 = input("Value 4: ")
lista = [v1, v3]
lista = list.sort(lista)
a = lista[1] - lista[0]
list = [v2, v4]
list = list.sort(list)
b = list[1] = list[0]
print str(a)+str("a")+str(" = ")+str(b) …Run Code Online (Sandbox Code Playgroud) 假设我们有一个列表:
a = [4, 8, 1, 7, 3, 0, 5, 2, 6, 9]
Run Code Online (Sandbox Code Playgroud)
现在,a.sort()将对列表进行排序.如果我们只想对列表的一部分进行排序,仍然存在,该怎么办?在C++中我们可以写:
int array = { 4, 8, 1, 7, 3, 0, 5, 2, 6, 9 };
int * ptr = array;
std::sort( ptr + 1, ptr + 4 );
Run Code Online (Sandbox Code Playgroud)
Python中有类似的方法吗?
Pandas 操作通常会创建原始数据帧的副本。正如 SO 上的一些答案指出的那样,即使在使用时inplace=True,许多操作仍然会创建一个副本来进行操作。
现在,如果我告诉我的同事,每次我想要申请+2一个列表时,我都会在做之前复制整个内容,我想我会被称为疯子。然而,这就是 Pandas 所做的。即使是简单的操作(例如追加)也会重新分配整个数据帧。
必须在每个操作中重新分配和复制所有内容似乎是对任何数据进行操作的非常低效的方法。它还使得无法对特别大的数据帧进行操作,即使它们适合您的 RAM。
此外,这对于 Pandas 开发者或用户来说似乎不是问题,以至于有一个开放的问题 #16529 讨论完全删除该inplace参数,该问题得到了大部分积极的回应;有些从 1.0 开始就被弃用了。好像我错过了一些东西。那么,我错过了什么?
始终在操作上复制数据帧而不是尽可能就地执行它们有什么优点?
注意:我同意方法链接非常简洁,我一直使用它。然而,我觉得“因为我们可以方法链”并不是完整的答案,因为 Pandas 有时甚至在inplace=True方法中进行复制,而这些方法并不意味着被链接。因此,我正在寻找其他一些答案来了解为什么这是一个合理的默认值。
我已将此报告为大熊猫问题.与此同时,我发布此处希望节省其他时间,以防他们遇到类似的问题.
在分析需要优化的进程时,我发现重命名列不在适当位置可以提高x120的性能(执行时间).分析表明这与垃圾收集有关(见下文).
此外,通过避免使用dropna方法来恢复预期的性能.
以下简短示例演示了因子x12:
import pandas as pd
import numpy as np
Run Code Online (Sandbox Code Playgroud)
%%timeit
np.random.seed(0)
r,c = (7,3)
t = np.random.rand(r)
df1 = pd.DataFrame(np.random.rand(r,c), columns=range(c), index=t)
indx = np.random.choice(range(r),r/3, replace=False)
t[indx] = np.random.rand(len(indx))
df2 = pd.DataFrame(np.random.rand(r,c), columns=range(c), index=t)
df = (df1-df2).dropna()
## inplace rename:
df.rename(columns={col:'d{}'.format(col) for col in df.columns}, inplace=True)
Run Code Online (Sandbox Code Playgroud)
100个循环,最佳3:每循环15.6毫秒
第一输出线%%prun:
ncalls tottime percall cumtime percall filename:lineno(function)
Run Code Online (Sandbox Code Playgroud)1 0.018 0.018 0.018 0.018 {gc.collect}
%%timeit
np.random.seed(0)
r,c = (7,3)
t = np.random.rand(r)
df1 = pd.DataFrame(np.random.rand(r,c), …Run Code Online (Sandbox Code Playgroud) 所以Quicksort的空间效率是O(log(n)).这是维护调用堆栈所需的空间.
现在,根据Quicksort上的维基百科页面,这可以作为就地算法,因为算法只是交换输入数据结构中的元素.
然而,根据这个页面,空间效率O(log n)使Quicksort不合格,因为它的空间效率大于O(1).根据该定义,任何空间效率大于O(1)的算法都不是就地的.所以我认为这意味着根据定义,所有递归算法都没有到位?
显然,这里有两种不同的就地定义.维基百科并不总是一个完全可靠的来源,所以我咨询了我的一位教授.
我的教授同意第二个定义.他说Quicksort不到位.即使数据保留在输入数组中,堆栈所需的额外空间也会使其失去资格.我的教授写了一本关于算法的畅销书,所以我非常尊重他的观点,但这个答案对我来说似乎不正确.
我认为就地的属性非常直观.数据保持不变.它不会从它的原始数据结构中移动.对我来说,这个定义更有用,因为它意味着您可以使用指针执行算法,而不是要求您复制数据.这似乎是算法的一个有价值的属性,并且名副其实"就地".
algorithm computer-science quicksort in-place space-efficiency
我有一个需要在某种条件下更新的json文件.
示例json
{
"Actions" : [
{
"value" : "1",
"properties" : {
"name" : "abc",
"age" : "2",
"other ": "test1"
}
},
{
"value" : "2",
"properties" : {
"name" : "def",
"age" : "3",
"other" : "test2"
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
我正在编写一个脚本,它使用Jq匹配值和更新,如下所示
cat sample.json | jq '.Actions[] | select (.properties.age == "3") .properties.other = "no-test"'
Run Code Online (Sandbox Code Playgroud)
输出(打印到终端)
{
"value": "1",
"properties": {
"name": "abc",
"age": "2",
"other ": "test1"
}
}
{
"value": "2",
"properties": {
"name": "def", …Run Code Online (Sandbox Code Playgroud) 我有以下代码试图规范化m x n数组的值(它将用作神经网络的输入,其中m是训练示例n的数量,并且是特征的数量).
但是,当我在脚本运行后检查解释器中的数组时,我发现这些值没有规范化; 也就是说,它们仍然具有原始值.我想这是因为array函数内部变量的赋值只能在函数中看到.
我怎样才能实现这种规范化?或者我必须从normalize函数返回一个新数组?
import numpy
def normalize(array, imin = -1, imax = 1):
"""I = Imin + (Imax-Imin)*(D-Dmin)/(Dmax-Dmin)"""
dmin = array.min()
dmax = array.max()
array = imin + (imax - imin)*(array - dmin)/(dmax - dmin)
print array[0]
def main():
array = numpy.loadtxt('test.csv', delimiter=',', skiprows=1)
for column in array.T:
normalize(column)
return array
if __name__ == "__main__":
a = main()
Run Code Online (Sandbox Code Playgroud) 我正准备进行软件工作面试,而且我在就地修改阵列时遇到了麻烦.例如,在out-shuffle问题中,你交错两个数组的一半,这样1 2 3 4 5 6 7 8就会变成1 5 2 6 3 7 4 8. 这个问题要求一个恒定存储器解决方案(和线性) - 时间,虽然我不确定这是否可能).
首先,我认为线性算法是微不足道的,但后来我无法解决它.然后我找到了一个简单的O(n^2)算法,但它花了我很长时间.我仍然没有找到更快的解决方案.
我记得也很难解决Bentley编程珍珠中的类似问题,第2栏:旋转i位置左侧的数组(例如,旋转2的abcde变为cdeab),O(n)并且只有几个字节的额外空间.
有没有人有提示帮助我解决这些问题?是否有针对此类问题的特定教程?谢谢!
我有一个调用grep来处理文本文件的脚本.目前我正在做这样的事情.
$ grep 'SomeRegEx' myfile.txt > myfile.txt.temp
$ mv myfile.txt.temp myfile.txt
Run Code Online (Sandbox Code Playgroud)
我想知道是否有任何方法可以进行就地处理,例如将结果存储到相同的原始文件而不必创建临时文件,然后在处理完成时将原始文件替换为临时文件.
当然,我欢迎评论为什么应该或不应该这样做,但我主要关心的是它是否可以完成.在这个例子中我正在使用grep,但我对Unix工具感兴趣.谢谢!