1.pandas.loc()方法
def invalid_tweets(tweets: pd.DataFrame) -> pd.DataFrame:
return tweets.loc[(tweets['content'].str.len()>15),'tweet_id']
运行上面代码报错提示,返回的是Series结构。因为.loc
方法在指定单个列名时没有使用方括号,导致返回的是一个Series
对象,而不是函数签名中声明的DataFrame
。在Pandas中,当使用.loc
并指定单个列名时,即使没有使用方括号,返回的也是一个Series
,而不是DataFrame
。在.loc
方法中使用方括号来指定列名,即使只选择一列。这样可以保证返回的数据结构与函数签名一致。
loc()方法如果没有指定第二个参数(列名),将返回符合条件该行所有的元素。
2.
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
length=len(nums)
for i in range(0,length):
for j in range(i+1,length):
if nums[j]==target-nums[i]:
return [i,j]
这道题一直报错的原因是,range函数的用法,误认为range(0,i)是从0到i,其实是从0到i-1
3.python画柱状图
将生成不同分类器在不同指标的性能,我之前错误的认为先生成一个指标刻度下所有分类器的性能,然后再生成下一个指标刻度下分类器的性能。其实是生成一个分类器在所有不同指标的性能,然后再生成下一个分类器的不同指标的性能。
svm=[accuracy_SVM,f1_SVM,precision_SVM,recall_SVM]
rf=[accuracy_RF,f1_RF,precision_RF,recall_RF]
dt=[accuracy_DT,f1_DT,precision_DT,recall_DT]
matplotlib.rcParams['font.family']='SimHei' # 添加中文字体
x=np.arange(4)
xticks=['Accuracy','F1','Precision','Recall']
plt.bar(x - 0.2, svm, width=0.2, label='SVM')
plt.bar(x, rf, width=0.2, label='RF')
plt.bar(x + 0.2, dt, width=0.2, label='DT')
plt.xticks(x, xticks)
plt.legend()
plt.title('不同分类器性能对比')
plt.xlabel('指标',fontsize=14)
plt.ylabel('值',fontsize=14)
plt.show()
4.OS 文件操作
使用os.listdir()列出当前目录下的所有文件和目录
os.path.join()
函数是 Python 中 os.path
模块的一个非常有用的函数,它用于将多个路径组件合并成一个完整的路径。
import os
PATH="C:\\Users\\31911\\Desktop\\ML\\train\\NORMAL"
for name in os.listdir(PATH):
img_path=os.path.join(PATH,name)
print(img_path)
5.
我的答案:
def romanToInt(self, s: str) -> int:
data={'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
result=data[s[0]]
for i in range(1,len(s)-1):
if len(s)==2:
if data[s[1]]>data[s[0]]:
result=data[s[1]]-data[s[0]]
else:
result=data[s[1]]+data[s[0]]
else:
if data[s[i]]<data[s[i+1]]:
result-=data[s[i]]
else:
result+=data[s[i]]
result=data[s[-1]]+result
return result
正确答案:
def romanToInt(self, s: str) -> int:
a={'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
ans=0
for i in range(len(s)):
if i<len(s)-1 and a[s[i]]<a[s[i+1]]:
ans-=a[s[i]]
else:
ans+=a[s[i]]
return ans
相比于正确答案,我给出的题解无疑是丑陋的,我把len(s)=2的情况单独拎了出来,但是可以用相同的逻辑处理这个特殊情况,并且就算计算出len(s)=2的情况最后的结果还是被覆盖掉了。
此外本题还涉及到一个enumerate()函数的用途。
enumerate(iterable, start=0)
iterable
:一个可迭代对象,比如列表、元组、字符串等。start
(可选参数):一个整数,指定索引的起始值,默认为0。
此外最初访问字典的键和值最初想到的是用items()方法,其实直接通过索引的方法可以直接获取键对应的值。
6.HOG提取图像特征
def load_images_from_folder(folder):
images = []
labels = []
hog_descriptor = cv2.HOGDescriptor()
for filename in os.listdir(folder):
img_path = os.path.join(folder, filename)
img = cv2.imread(img_path)
if img is not None:
img = cv2.resize(img, (64, 128)) # 调整图像大小
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换为灰度图
hog_features = hog_descriptor.compute(img_gray)
#print(hog_features.shape)
hog_features = hog_features.flatten()
images.append(hog_features) # 扁平化图像
labels.append(folder.split("\\")[-1] == 'NORMAL') # 生成标签
return np.array(images), np.array(labels)
(1)使用HOG特征提取时,只支持具有两个空间维度的图像。cv2.imread
读取的图像默认是BGR格式的三通道图像,OpenCV的HOGDescriptor期望输入是单通道的灰度图像。
- 第三个数字
(3)
表示图像的通道数,这里是3,意味着图像是彩色的,并且使用RGB(红绿蓝)颜色模型。
(2)HOG特征的计算依赖于图像被划分为多个小块(blocks)和单元(cells)。每个块由多个单元组成,每个单元收集一定数量的梯度方向直方图。如果图像尺寸不是块尺寸的整数倍,计算可能会失败或导致错误。将图像缩放到 (64, 64)
可能会导致特征矩阵的大小超出了OpenCV内部处理的限制,尤其是在高分辨率图像上。而 (64, 128)
可能在内存使用和内部处理上更为合适。(为什么将 img = cv2.resize(img, (64, 64)) 这句话改为 img = cv2.resize(img, (64, 128)) 错误就解决了)
7.Numpy 的基本概念
NumPy数组 和 原生Python Array(数组)之间有几个重要的区别:
NumPy 数组在创建时具有固定的大小,与Python的原生数组对象不同,更改ndarray的大小将创建一个新数组并删除原来的数组。NumPy 数组元素需具有相同的数据类型,因此在内存中的大小相同。NumPy 数组有助于对大量数据进行高级数学和其他类型的操作。通常,这些操作的执行效率更高,比使用Python原生数组的代码更少。越来越多的基于Python的科学和数学软件包使用NumPy数组,但它们在处理之前会会将输入的数组转换为NumPy的数组。
为何使用 NumPy?
在 Python 中,我们有满足数组功能的列表,但是处理起来很慢。NumPy 旨在提供一个比传统 Python 列表快 50 倍的数组对象。NumPy 中的数组对象称为 ndarray,它提供了许多支持函数,使得利用 ndarray 非常容易。数组在数据科学中非常常用,因为速度和资源非常重要。数据科学:计算机科学的一个分支,研究如何存储、使用和分析数据以从中获取信息。
为什么 NumPy 比列表快?
与列表不同,NumPy 数组存储在内存中的一个连续位置,因此进程可以非常有效地访问和操纵它们。这种行为在计算机科学中称为引用的局部性。这是 NumPy 比列表更快的主要原因。它还经过了优化,可与最新的 CPU 体系结构一同使用。
NumPy的数组类被调用ndarray。这里需要注意的是numpy.array这与标准Python库类不同array.array,array.array只处理一维数组并提供较少的功能。ndarray对象有更重要的属性,具体如下:
ndarray.ndim - 数组的轴(维度)的个数。在Python世界中,维度的数量被称为rank。ndarray.shape - 数组的维度。这是一个整数的元组,表示每个维度中数组的大小。shape 元组的长度就是rank或维度的个数 ndim。ndarray.size - 数组元素的总数。这等于 shape 的元素的乘积。ndarray.dtype - 一个描述数组中元素类型的对象。可以使用标准的Python类型创建或指定dtype。另外NumPy提供它自己的类型。ndarray.itemsize - 数组中每个元素的字节大小。例如,元素为 float64 类型的数组的 itemsize 为8(=64/8)。ndarray.data - 该缓冲区包含数组的实际元素。通常,我们不需要使用此属性,因为我们将使用索引访问数组中的元素。
dtype 对象是使用以下语法构造的:
numpy.dtype(object, align, copy)
object - 要转换为的数据类型对象align - 如果为 true,填充字段使其类似 C 的结构体。copy - 复制 dtype 对象 ,如果为 false,则是对内置数据类型对象的引用
8.Pandas 首字母大小写问题
问题描述:修复名字,使得只有第一个字符是大写的,其余都是小写的。
def fix_names(users: pd.DataFrame) -> pd.DataFrame:
users["name"] = users["name"].str.capitalize()
return users.sort_values("user_id")
str.title():
-
单词边界:
str.title()
会识别字符串中的单词边界,并只将每个单词的首字母转换为大写。单词边界通常由空格、标点符号或特定字符分隔。 -
转换规则:除了将首字母转换为大写外,该方法还会将单词中除首字母外的所有字母转换为小写。
-
非字母字符:如果字符串中包含非字母字符,这些字符将保持不变。
-
连续大写字母:如果字符串中有连续的大写字母(如缩写或专有名词),
str.title()
可能不会按照预期工作,因为它会将这些连续大写字母的第一个字母转换为小写。 -
使用场景:这个方法适用于需要将文本格式化为标题形式的情况,例如书籍标题、文章标题等。
str.capitalize():
-
首字母大写:该方法将字符串的第一个字母转换为大写,无论它原本是大写还是小写。
-
其余字母小写:除了首字母外,字符串中的其他字母都会被转换为小写。
-
空字符串:如果字符串为空,
str.capitalize()
会返回一个空字符串。 -
非字母字符:字符串中的非字母字符不会被转换,保持原样。
-
使用场景:这个方法适用于需要将文本的首字母大写的场景,例如在处理用户输入或生成文本时。
9.mysql数据表连接
内连接:获取两个表中字段匹配关系的记录。
SELECT a.nhooo_id, a.nhooo_author, b.nhooo_count FROM nhooo_tbl a INNER JOIN tcount_tbl b ON a.nhooo_author = b.nhooo_author;
左连接:获取左表所有记录,即使右表没有对应匹配的记录。
SELECT a.nhooo_id, a.nhooo_author, b.nhooo_count FROM nhooo_tbl a LEFT JOIN tcount_tbl b ON a.nhooo_author = b.nhooo_author;
右连接:与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
SELECT a.nhooo_id, a.nhooo_author, b.nhooo_count FROM nhooo_tbl a RIGHT JOIN tcount_tbl b ON a.nhooo_author = b.nhooo_author;
10.MYSQL 子查询 和limit 子句
问题描述:查询并返回 Employee
表中第二高的薪水 。如果不存在第二高的薪水,查询应该返回 null(Pandas 则返回 None)
。
我自己写的:
select MAX(salary) AS SecondHighestSalary
FROM Employee
WHERE salary<(
SELECT MAX(salary)
FROM Employee
)
官方题解:
SELECT DISTINCT
Salary AS SecondHighestSalary
FROM
Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1
LIMIT 1
表示从查询结果中只返回一条记录。OFFSET 1
表示在返回记录之前,先跳过前面的一条记录。由于记录已经按照薪水降序排列,所以跳过薪水最高的那条记录后,下一条记录就是薪水第二高的。