我知道Python列表有一种方法可以返回第一个索引:
>>> l = [1, 2, 3]
>>> l.index(2)
1
Run Code Online (Sandbox Code Playgroud)
NumPy阵列有类似的东西吗?
我有一个数组X:
X = np.array([[4, 2],
[9, 3],
[8, 5],
[3, 3],
[5, 6]])
Run Code Online (Sandbox Code Playgroud)
我希望在这个数组中找到几个值的行的索引:
searched_values = np.array([[4, 2],
[3, 3],
[5, 6]])
Run Code Online (Sandbox Code Playgroud)
对于这个例子,我想要一个结果,如:
[0,3,4]
Run Code Online (Sandbox Code Playgroud)
我有一个代码这样做,但我认为它过于复杂:
X = np.array([[4, 2],
[9, 3],
[8, 5],
[3, 3],
[5, 6]])
searched_values = np.array([[4, 2],
[3, 3],
[5, 6]])
result = []
for s in searched_values:
idx = np.argwhere([np.all((X-s)==0, axis=1)])[0][1]
result.append(idx)
print(result)
Run Code Online (Sandbox Code Playgroud)
我找到了类似问题的答案,但它仅适用于1d阵列.
有没有办法以更简单的方式做我想做的事情?
我有一个使用sklearn的SVC类的程序。确实,我正在使用使用SVC类的OneVsRestClassifier类。我的问题是predict_proba()方法有时返回的向量太短。这是因为classes_属性缺少一个类,这种情况发生在训练过程中不存在标签时。
考虑下面的示例(下面显示的代码)。假设所有可能的类分别是1、2、3和4。现在假设训练数据恰好不包含任何用3类标记的数据。这很好,除非当我调用predict_proba()时我想要一个长度为4的向量。 ,我得到一个长度为3的向量。也就是说,predict_proba()返回[p(1)p(2)p(4)],但是我想要[p(1)p(2)p(3)p(4) )],其中p(3)= 0。
我想clf.classes_是由培训期间看到的标签隐式定义的,在这种情况下是不完整的。有什么方法可以显式设置可能的类标签?我知道一个简单的解决方法是仅采用predict_proba()输出并手动创建所需的数组。但是,这很不方便,可能会使我的程序变慢。
# Python 2.7.6
from sklearn.svm import SVC
from sklearn.multiclass import OneVsRestClassifier
import numpy as np
X_train = [[1], [2], [4]] * 10
y = [1, 2, 4] * 10
X_test = [[1]]
clf = OneVsRestClassifier(SVC(probability=True, kernel="linear"))
clf.fit(X_train, y)
# calling predict_proba() gives: [p(1) p(2) p(4)]
# I want: [p(1) p(2) p(3) p(4)], where p(3) = 0
print clf.predict_proba(X_test)
Run Code Online (Sandbox Code Playgroud)
我想到的变通方法会创建一个新的概率列表,并通过多个append()调用一次将其构建为一个元素(请参见下面的代码)。与让predict_proba()自动返回我想要的东西相比,这似乎要慢一些。我还不知道它是否会大大减慢我的程序的速度,因为我还没有尝试过。无论如何,我想知道是否有更好的方法。
def workAround(probs, classes_, all_classes):
"""
probs: list of probabilities, output of predict_proba (but 1D)
classes_: …Run Code Online (Sandbox Code Playgroud) 我有一个 numpy 数组,其元素是唯一的,例如:
b = np.array([5, 4, 6, 8, 1, 2])
(Edit2:b可以有大数和浮点数。上面的例子是为了简单起见)
我得到的数字是 b 中的元素。
我想找到自己的指数b,这意味着我要反向映射,从价值指数,中b。
我可以
for number in input:
ind = np.where(number==b)
Run Code Online (Sandbox Code Playgroud)
每次调用where.
我还可以创建一个字典,
d = {}
for i, element in enumerate(list(b)):
d[element] = i
Run Code Online (Sandbox Code Playgroud)
我可以在“预处理”时创建这个字典,但我仍然会留下一个看起来很奇怪的字典,在一个主要是 numpy 的代码中,这似乎(对我来说)不是 numpy 的使用方式。
如何在 numpy 中进行这种反向映射?
使用情况(需要 O(1) 时间和内存):
print("index of 8 is: ", foo(b, 8))
Run Code Online (Sandbox Code Playgroud)
像这里解释的那样使用 in1d并不能解决我的问题。使用他们的例子:
b = np.array([1, 2, 3, 10, 4])
Run Code Online (Sandbox Code Playgroud)
我希望能够10在运行时在 …
我正在编写一个从文本文件中读取数据的代码.我使用numpy loadtxt加载数据,它看起来像这样:
import numpy as np
Shop_Products = np.array(['Tomatos', 'Bread' , 'Tuna', 'Milk', 'Cheese'])
Shop_Inventory = np.array([12, 6, 10, 7, 8])
Run Code Online (Sandbox Code Playgroud)
我想检查一下我的产品:
Shop_Query = np.array(['Cheese', 'Bread']
Run Code Online (Sandbox Code Playgroud)
现在我想在Shop_Products数组中找到这些"items"indeces,而不进行for循环和检查.
我想知道是否可以使用任何numpy方法:我想使用intercept1d找到常见项目然后使用searchsorted.但是,我无法对"产品"列表进行排序,因为我不想放弃原始排序(例如,我会使用索引直接查找每个产品的库存).
关于"pythonish"解决方案的任何建议?