假设我有一个非常大的稀疏数据矩阵,但我只想看一下它的样本,使它更稀疏.假设我还有一个三元数据框,包括数据的行/列/值列(从csv文件导入).我知道我可以使用库(Matrix)的sparseMatrix()函数来创建稀疏矩阵
sparseMatrix(i=df$row,j=df$column,x=df$value)
Run Code Online (Sandbox Code Playgroud)
但是,由于我的值,我最终得到了一个稀疏矩阵,其中包含数百万行数万列(其中大多数都是空的,因为我的子集排除了大多数行和列).所有这些零行和列最终都会扭曲我的一些函数(例如,采用聚类 - 当一个原点甚至不是有效点时,我最终会得到一个包含原点的聚类).我想执行相同的操作,但使用i和j作为rownames和colnames.我已经尝试创建一个密集的矢量,采样到最大尺寸并使用添加值
denseMatrix <- matrix(0,nrows,ncols,dimnames=c(df$row,df$column))
denseMatrix[as.character(df$row),as.character(df$column)]=df$value
Run Code Online (Sandbox Code Playgroud)
(实际上我一直把它设置为等于1,因为我对这种情况下的值不感兴趣)但是我发现它填充了整个矩阵,因为它需要所有行和列的交叉而不仅仅是row1*col1,row2*col2 ...有没有人知道如何完成我想要做的事情?或者我可以填写一个稀疏矩阵并简单地以某种方式丢弃所有零行和列以将其自身压缩为更密集的形式(但我想保留一些参考回原始行和列号)我感谢任何建议!
这是一个例子:
> rows<-c(3,1,3,5)
> cols<-c(2,4,6,6)
> mtx<-sparseMatrix(i=rows,j=cols,x=1)
> mtx
5 x 6 sparse Matrix of class "dgCMatrix"
[1,] . . . 1 . .
[2,] . . . . . .
[3,] . 1 . . . 1
[4,] . . . . . .
[5,] . . . . . 1
Run Code Online (Sandbox Code Playgroud)
我想摆脱colums 1,3和5以及第2行和第4行.这是一个非常简单的例子,但想象一下,如果没有行号1,3和5,它们分别是1000,3000和5000.然后它们之间会有更多的空行.这是当我使用具有命名行/列的密集矩阵时发生的情况
> dmtx<-matrix(0,3,3,dimnames=list(c(1,3,5),c(2,4,6)))
> dmtx
2 4 6
1 0 0 0
3 0 0 0 …
Run Code Online (Sandbox Code Playgroud) 我有两个sq矩阵(a,b)的大小为100000 X 100000.我必须区分这两个矩阵(c = ab).结果矩阵'c'是稀疏矩阵.我想找到所有非零元素的索引.我必须多次做这个操作(> 100).
最简单的方法是使用两个for循环.但这是计算密集型的.你能告诉我任何算法或包/库最好在R/python/c中尽快做到这一点吗?
我想在Python中找到一种快速的方法(没有for循环)来分配数组的重新索引索引.这是使用for循环的期望结果:
import numpy as np
a=np.arange(9, dtype=np.float64).reshape((3,3))
# The array indices: [2,3,4] are identical.
Px = np.uint64(np.array([0,1,1,1,2]))
Py = np.uint64(np.array([0,0,0,0,0]))
# The array to be added at the array indices (may also contain random numbers).
x = np.array([.1,.1,.1,.1,.1])
for m in np.arange(len(x)):
a[Px[m]][Py[m]] += x
print a
%[[ 0.1 1. 2.]
%[ 3.3 4. 5.]
%[ 6.1 7. 8.]]
Run Code Online (Sandbox Code Playgroud)
当我尝试添加x
到a
索引时,Px,Py
我显然得不到相同的结果(3.3对3.1):
a[Px,Py] += x
print a
%[[ 0.1 1. 2.]
%[ 3.1 4. 5.]
%[ …
Run Code Online (Sandbox Code Playgroud) 其中包含TypeError的代码."列表索引必须是整数,而不是列表",尽管它们是整数.我很感激你帮助我弄清楚什么是错的.我需要的是从源7x5选项卡获取具有不同值的矩阵7x5.错误发生在最后一行.
lines = []
with open("text.txt") as f:
for line in f:
line = [int(x) for x in line if (x != ' ') and (x != '\n')]
lines.append(line)
f.close()
Run Code Online (Sandbox Code Playgroud)
读取文件后的内容是带有"行"数字的列表列表.这是整数.不是字符串.喜欢:
>> [[1, 2, 3...], [4, 5, 6...], [7, 8, 9...],[...]]
i = 1
j = 1
T = []
T.append(lines[0][0])
Run Code Online (Sandbox Code Playgroud)
我这样做是为了避免IndexError
(列出超出范围)在最后一行(i-1
和东西).虽然,我认为这不是真正的蟒蛇方式.我也很感激这方面的帮助.
for i in lines:
for j in lines:
T[i][j] = lines[i][j] + max(T[i][j-1], T[i-1][j])
Run Code Online (Sandbox Code Playgroud)
这是发生错误的地方.如果已经存在i
,我不应该得到什么.j
int
我经常使用numpy.where函数来收集具有某些属性的矩阵的索引元组.例如
import numpy as np
X = np.random.rand(3,3)
>>> X
array([[ 0.51035326, 0.41536004, 0.37821622],
[ 0.32285063, 0.29847402, 0.82969935],
[ 0.74340225, 0.51553363, 0.22528989]])
>>> ix = np.where(X > 0.5)
>>> ix
(array([0, 1, 2, 2]), array([0, 2, 0, 1]))
Run Code Online (Sandbox Code Playgroud)
ix现在是包含行索引和列索引的ndarray对象的元组,而子表达式X> 0.5包含一个布尔矩阵,指示哪些单元格具有> 0.5属性.每种表示都有其自身的优点.
获取ix对象并在以后需要时将其转换回布尔形式的最佳方法是什么?例如
G = np.zeros(X.shape,dtype=np.bool)
>>> G[ix] = True
Run Code Online (Sandbox Code Playgroud)
是否有一个单行程完成同样的事情?
我生成了一个分组数据帧df = df.groupby(['X','Y']).max()
,然后我想写入(到 csv,没有索引)。所以我需要将 'X' 和 'Y' 转换回常规列;我尝试使用reset_index()
,但列的顺序是错误的。
如何将“X”和“Y”列恢复到其确切的原始列位置?
解决方法是:
df.reset_index(level=0, inplace=True)
Run Code Online (Sandbox Code Playgroud)
然后找到一种方法来更改列的顺序?
(我也找到了这种方法,用于 multiindex)
我有一个相当简单的问题,但在任何地方都找不到答案。我正在迭代一系列切片,如下所示:
for index, arg := range os.Args[1:] {
s += fmt.Sprintf("%d: %s", index, arg)
}
Run Code Online (Sandbox Code Playgroud)
据我了解,range
迭代切片,并index
从范围创建,并且它是从零开始的。我得到输出:
0: argument_1
1: argument_2
// etc.
Run Code Online (Sandbox Code Playgroud)
但这不是我所期望的 - 我需要range
保留该切片的索引,因此我的输出如下所示:
1: argument_1
2: argument_2
// etc.
Run Code Online (Sandbox Code Playgroud)
最明显的方法是shift
在循环中添加索引:
shift := 1
for index, arg := range os.Args[shift:] {
index += shift
s += fmt.Sprintf("%d: %s", index, arg)
}
Run Code Online (Sandbox Code Playgroud)
但我想知道,是否有更多的“Go-ish”方式来做到这一点,以及如何在像这样在 Go 中创建切片时保留索引?
我知道如何通过索引访问向量中的元素:
test = numpy.array([1,2,3,4,5,6])
indices = list([1,3,5])
print(test[indices])
Run Code Online (Sandbox Code Playgroud)
给出正确答案:[2 4 6]
但我正在尝试使用 2D 矩阵做同样的事情,例如:
currentGrid = numpy.array( [[0, 0.1],
[0.9, 0.9],
[0.1, 0.1]])
indices = list([(0,0),(1,1)])
print(currentGrid[indices])
Run Code Online (Sandbox Code Playgroud)
这应该为我显示“[0.0 0.9]”,表示矩阵中 (0,0) 处的值和 (1,1) 处的值。而是显示“[ 0.1 0.1]”。此外,如果我尝试使用 3 个索引:
indices = list([(0,0),(1,1),(0,2)])
Run Code Online (Sandbox Code Playgroud)
我现在收到以下错误:
Traceback (most recent call last):
File "main.py", line 43, in <module>
print(currentGrid[indices])
IndexError: too many indices for array
Run Code Online (Sandbox Code Playgroud)
我最终需要对这些索引处的所有元素应用一个简单的 max() 操作,并且需要以最快的方式来实现优化。
我究竟做错了什么 ?如何访问矩阵中的特定元素以非常有效的方式(不使用列表理解或循环)对它们进行一些操作。
我的问题是:我有一些项目的简单数组。我想List
使用ForEach
with显示这些项目.indices()
。(这是因为我的实际问题是Toggle
在 a 中处理的List
,对于isOn
绑定,我需要索引来处理绑定到 a 的模型EnvironmentObject
)。因此,遍历数组的items
解决方案对于我的问题是不可能的。
简化的起点如下所示:
struct ContentView: View {
@State var items = ["Item1", "Item2", "Item3"]
var body: some View {
List {
ForEach(items.indices) {index in
Text(self.items[index])
}.onDelete(perform: deleteItem)
}
}
func deleteItem(indexSet: IndexSet) {
self.items.remove(atOffsets: indexSet)
}
}
Run Code Online (Sandbox Code Playgroud)
如果我现在尝试滑动删除一行,则会收到以下错误消息:
Thread 1: Fatal error: Index out of range
Run Code Online (Sandbox Code Playgroud)
调试index
闭包内的值,我可以看到items
-array的索引没有更新。例如:如果我删除第一行"Item 1"
并检查index
删除行后的值,它将返回2
而不是0
(这是数组的预期第一个索引)。这是为什么,我该如何解决这个问题?
谢谢你的帮助!
我对索引范围运算符有点困惑:我期望表达式myString[..0]
应该等于myString[0..0]
, thenmyString.Substring(0, 1)
或myString[0].ToString()
, 并且在以下代码的情况下:
string myString = " abc";
string resultString = myString[..0];
Run Code Online (Sandbox Code Playgroud)
该resultString
值应该是一个空格" "
。不幸的是,我得到了String.Empty
:(
有谁知道为什么并且可以解释我为什么我错了?
微软文档没有描述类似的情况(或者我找不到它们)。